unofficial mirror of bug-guile@gnu.org 
 help / color / mirror / Atom feed
From: Taylan Kammer <taylan.kammer@gmail.com>
To: 39601@debbugs.gnu.org, Duy Nguyen <pclouds@gmail.com>
Subject: bug#39601: srfi library naming in r7rs
Date: Sat, 15 May 2021 19:44:04 +0200	[thread overview]
Message-ID: <42fc5b8b-5c9a-724d-230e-fc2b7981d913@gmail.com> (raw)
In-Reply-To: <CACsJy8DSXuPNo+ik6SLGSbahHCegGCVm8tEfVcyVX5zO4ncutw@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 823 bytes --]

Tag: patch


Hi,

For sake of having it documented here as well, attached is a patch
that implements a fix to this issue, that I recently sent to the
guile-devel mailing list.

Copying from the commit message:

It was already possible to import an SRFI module by referencing it
as (srfi :n) which is automatically translated to (srfi srfi-n), but
this conversion was only done during import.  After this change, it's
also possible to define a library as (srfi :n) which is automatically
translated to (srfi srfi-n) during definition.

It was not possible at all to define or import SRFI module names in the
R7RS format, (srfi n), where n is a non-negative exact integer.  It is
now possible both to define and import them as such, realized through
the same kind of conversion to a canonical (srfi srfi-n) name.


--
Taylan

[-- Attachment #2: 0001-Improve-support-for-R6-R7-SRFI-module-name-formats.patch --]
[-- Type: text/plain, Size: 5657 bytes --]

From 4f1a58972c4084e6ffea6443cd5b30b54ca8aa6b Mon Sep 17 00:00:00 2001
From: Taylan Kammer <taylan.kammer@gmail.com>
Date: Mon, 10 May 2021 18:12:34 +0200
Subject: [PATCH] Improve support for R6/R7 SRFI module name formats.

Fixes <https://bugs.gnu.org/39601>.

Partly fixes <https://bugs.gnu.org/40371>.

It was already possible to import an SRFI module by referencing it
as (srfi :n) which is automatically translated to (srfi srfi-n), but
this conversion was only done during import.  After this change, it's
also possible to define a library as (srfi :n) which is automatically
translated to (srfi srfi-n) during definition.

It was not possible at all to define or import SRFI module names in the
R7RS format, (srfi n), where n is a non-negative exact integer.  It is
now possible both to define and import them as such, realized through
the same kind of conversion to a canonical (srfi srfi-n) name.

* module/ice-9/r6rs-libraries.scm: Numerous changes.
---
 module/ice-9/r6rs-libraries.scm | 84 ++++++++++++++++++++++++---------
 1 file changed, 62 insertions(+), 22 deletions(-)

diff --git a/module/ice-9/r6rs-libraries.scm b/module/ice-9/r6rs-libraries.scm
index c6ba6a496..33dcbde22 100644
--- a/module/ice-9/r6rs-libraries.scm
+++ b/module/ice-9/r6rs-libraries.scm
@@ -20,6 +20,49 @@
 ;; This file is included from boot-9.scm and assumes the existence of (and 
 ;; expands into) procedures and syntactic forms defined therein.
 
+(define (sym? stx)
+  (symbol? (syntax->datum stx)))
+
+(define (n? stx)
+  (let ((n (syntax->datum stx)))
+    (and (exact-integer? n)
+         (not (negative? n)))))
+
+(define (colon-n? x)
+  (let ((sym (syntax->datum x)))
+    (and (symbol? sym)
+         (let ((str (symbol->string sym)))
+           (and (string-prefix? ":" str)
+                (let ((num (string->number (substring str 1))))
+                  (and (exact-integer? num)
+                       (not (negative? num)))))))))
+
+(define (srfi-name? stx)
+  (syntax-case stx (srfi)
+    ((srfi n rest ...)
+     (and (and-map sym? #'(rest ...))
+          (or (n? #'n)
+              (colon-n? #'n))))
+    (_ #f)))
+
+(define (module-name? stx)
+  (or (srfi-name? stx)
+      (syntax-case stx ()
+        ((name name* ...)
+         (and-map sym? #'(name name* ...)))
+        (_ #f))))
+
+(define (make-srfi-n context n)
+  (datum->syntax
+   context
+   (string->symbol
+    (string-append
+     "srfi-"
+     (let ((n (syntax->datum n)))
+       (if (symbol? n)
+           (substring (symbol->string n) 1)
+           (number->string n)))))))
+
 (define (resolve-r6rs-interface import-spec)
   (define (make-custom-interface mod)
     (let ((iface (make-module)))
@@ -37,27 +80,13 @@
     (for-each (lambda (mod)
                 (module-for-each f mod))
               (module-and-uses mod)))
-  (define (sym? x) (symbol? (syntax->datum x)))
 
   (syntax-case import-spec (library only except prefix rename srfi)
     ;; (srfi :n ...) -> (srfi srfi-n ...)
     ;; (srfi n ...) -> (srfi srfi-n ...)
     ((library (srfi n rest ... (version ...)))
-     (and (and-map sym? #'(srfi rest ...))
-          (or (and
-               (symbol? (syntax->datum #'n))
-               (let ((str (symbol->string (syntax->datum #'n))))
-                 (and (string-prefix? ":" str)
-                      (and=> (string->number (substring str 1))
-                             exact-integer?))))
-              (exact-integer? (syntax->datum #'n))))
-     (let ((srfi-n (string->symbol
-                    (string-append
-                     "srfi-"
-                     (let ((n (syntax->datum #'n)))
-                       (if (symbol? n)
-                           (substring (symbol->string n) 1)
-                           (number->string n)))))))
+     (srfi-name? #'(srfi n rest ...))
+     (let ((srfi-n (make-srfi-n #'srfi #'n)))
        (resolve-r6rs-interface
         (syntax-case #'(rest ...) ()
           (()
@@ -152,11 +181,11 @@
              (lp (cdr in) (cons (vector to replace? var) out))))))))
     
     ((name name* ... (version ...))
-     (and-map sym? #'(name name* ...))
+     (module-name? #'(name name* ...))
      (resolve-r6rs-interface #'(library (name name* ... (version ...)))))
 
-    ((name name* ...) 
-     (and-map sym? #'(name name* ...))
+    ((name name* ...)
+     (module-name? #'(name name* ...))
      (resolve-r6rs-interface #'(library (name name* ... ()))))))
 
 (define-syntax library
@@ -195,23 +224,34 @@
               (else
                (lp #'rest (cons #'id e) r x))))))))
 
-    (syntax-case stx (export import)
+    (syntax-case stx (export import srfi)
       ((_ (name name* ...)
           (export espec ...)
           (import ispec ...)
           body ...)
-       (and-map identifier? #'(name name* ...))
+       (module-name? #'(name name* ...))
        ;; Add () as the version.
        #'(library (name name* ... ())
            (export espec ...)
            (import ispec ...)
            body ...))
 
+      ((_ (srfi n rest ... (version ...))
+          (export espec ...)
+          (import ispec ...)
+          body ...)
+       (srfi-name? #'(srfi n rest ...))
+       (let ((srfi-n (make-srfi-n #'srfi #'n)))
+         #`(library (srfi #,srfi-n rest ... (version ...))
+             (export espec ...)
+             (import ispec ...)
+             body ...)))
+
       ((_ (name name* ... (version ...))
           (export espec ...)
           (import ispec ...)
 	  body ...)
-       (and-map identifier? #'(name name* ...))
+       (module-name? #'(name name* ...))
        (call-with-values
            (lambda ()
              (compute-exports 
-- 
2.30.2


  reply	other threads:[~2021-05-15 17:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-14 14:48 bug#39601: srfi library naming in r7rs Duy Nguyen
2021-05-15 17:44 ` Taylan Kammer [this message]
  -- strict thread matches above, loose matches on Subject: below --
2021-10-18 12:54 bug#51264: Calling ‘texi-fragment->stexi’ in parallel leads to crashes Ludovic Courtès
2021-11-01 17:52 ` bug#39601: srfi library naming in r7rs lloda
2021-11-01 18:42   ` Taylan Kammer
2021-11-02 17:53     ` lloda
2021-11-03  7:37     ` Linus Björnstam

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=42fc5b8b-5c9a-724d-230e-fc2b7981d913@gmail.com \
    --to=taylan.kammer@gmail.com \
    --cc=39601@debbugs.gnu.org \
    --cc=pclouds@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).