From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Maxim Cournoyer Newsgroups: gmane.lisp.guile.devel Subject: [PATCH v5 04/15] r7rs-libraries: Better support R7RS SRFI library names. Date: Wed, 29 Nov 2023 16:59:32 -0500 Message-ID: <20231129220225.6819-5-maxim.cournoyer@gmail.com> References: <20231129220225.6819-1-maxim.cournoyer@gmail.com> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="11964"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Maxim Cournoyer To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Wed Nov 29 23:04:01 2023 Return-path: Envelope-to: guile-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1r8Sez-0002mt-43 for guile-devel@m.gmane-mx.org; Wed, 29 Nov 2023 23:03:57 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r8Se0-0001AP-Su; Wed, 29 Nov 2023 17:02:58 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r8Sdv-00019H-4h for guile-devel@gnu.org; Wed, 29 Nov 2023 17:02:52 -0500 Original-Received: from mail-ot1-x32d.google.com ([2607:f8b0:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r8Sdr-0004CI-Ex for guile-devel@gnu.org; Wed, 29 Nov 2023 17:02:49 -0500 Original-Received: by mail-ot1-x32d.google.com with SMTP id 46e09a7af769-6d81173a219so219087a34.3 for ; Wed, 29 Nov 2023 14:02:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701295366; x=1701900166; darn=gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JjB9z6q9OrMMA/jp2XzwYCYrnys//HLJbRFw3fpIVVE=; b=BHO9esCyUZr1h5J755gNDRqLBsfUFZyATMlxE0jOT/fqvBNJaO0swSjVSGtWFTYIa0 IG7qzCWIteGdvHmaL3dAJeRvyfpkZgVjjflToL2yGY6rkBJrFwkmNAkny15xOUsSfkFR DNsaErPEj8WvnwplTYoxf0xPRkQIh0ZLEDMREgntfKxFRIbZjLsOYssMiQXd9qPGV1qK VDtIBegxKv3NMKYAMY1sOPuZw92SHmPp7MJFh0fx/vVSjqg61nyMtxBKfmuUf1XpBnBU YcGlybeCLzhFHZtvqcgWuNkeXSKs1cD3pYZcJGkU+MQK36VtlshRvWU+1gxfOG8fDfUB izxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701295366; x=1701900166; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JjB9z6q9OrMMA/jp2XzwYCYrnys//HLJbRFw3fpIVVE=; b=i3zdd0Vz6CzPBjNZ+R4j5pMxMneRmcFko5FoEsSGbVDXTsw73S+AedEUc4rGhbPZOD 17ucTfCZcBPMONyFW0fu3yR0Vr38rT6fzQwxOm4pSW2GMmB9DpuwaGruGzBFHzdklPgS HtnhE01T9ubGMhcGlZNgDWkbFVAQDs4I4KWU6W2r3+GXj75J42wiANDiF4WD2fsruiKl EfKT8K3fk2lKumRNRyAlIJlWOGO1xim7d8/m9FF63gpHhpM9DYYQMkZP9FTQYr5D5sop Wco3n5WJe3Txar2R3QrZiVF2isFTlCZ6dSHhDUI9AEjppLSBDwZxR/PBBorSOo8BhEEk a+KA== X-Gm-Message-State: AOJu0Yx30C6O/FnA5x/AEtDhEPX+zy/5PK0qV1/EdaRtokRtmrK2IS6/ wCH9bJAYLVieXTpVwL+QAH2O2zhbaRI= X-Google-Smtp-Source: AGHT+IHFth/nD/ds14J/uOZE1hrebqrHLcf0cJZ9bFki65/BRbwa373VjKtcOc5ASVuOK2Sz7966HA== X-Received: by 2002:a05:6830:1491:b0:6bc:f999:a544 with SMTP id s17-20020a056830149100b006bcf999a544mr21975685otq.15.1701295365646; Wed, 29 Nov 2023 14:02:45 -0800 (PST) Original-Received: from localhost.localdomain (dsl-158-174.b2b2c.ca. [66.158.158.174]) by smtp.gmail.com with ESMTPSA id g15-20020ad4510f000000b0067a2a0b44ddsm4644444qvp.44.2023.11.29.14.02.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Nov 2023 14:02:45 -0800 (PST) X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231129220225.6819-1-maxim.cournoyer@gmail.com> Received-SPF: pass client-ip=2607:f8b0:4864:20::32d; envelope-from=maxim.cournoyer@gmail.com; helo=mail-ot1-x32d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Original-Sender: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.lisp.guile.devel:22145 Archived-At: * module/ice-9/r6rs-libraries.scm (resolve-r6rs-interface : Relax symbol requirements. : Add a new syntax matching clause to avoid stripping the 3rd identifier in a R7RS SRFI module name. (library): Move R7RS specifics to... * module/ice-9/r7rs-libraries.scm (define-library): ... here. r6rs-module-name, r7rs-import->r6rs-import>: New nested procedures, used to translate the library name and import sets. : Apply r7rs-name->r6rs-name to the library name. * test-suite/tests/rnrs-libraries.test ("import features") <"renaming works">: Extend test. <"import works">: New test. * NEWS: Mention bug fix. Fixes: https://bugs.gnu.org/67412 --- (no changes since v1) NEWS | 3 + module/ice-9/r6rs-libraries.scm | 88 ++++++++-------------------- module/ice-9/r7rs-libraries.scm | 48 ++++++++++++++- test-suite/tests/rnrs-libraries.test | 12 +++- 4 files changed, 85 insertions(+), 66 deletions(-) diff --git a/NEWS b/NEWS index 6284bb127..af66c80bd 100644 --- a/NEWS +++ b/NEWS @@ -48,6 +48,9 @@ a buffer overrun, and so might vary. This problem affected a number of other operations, given the internal use of those functions. +** Add better support to R7RS library names for SRFI modules + () + ** Fix 'include' not finding included files when byte compiling Guile () ** R7RS define-library now properly supports 'rename' declarations diff --git a/module/ice-9/r6rs-libraries.scm b/module/ice-9/r6rs-libraries.scm index f27b07841..a2ba3a740 100644 --- a/module/ice-9/r6rs-libraries.scm +++ b/module/ice-9/r6rs-libraries.scm @@ -1,6 +1,6 @@ ;;; r6rs-libraries.scm --- Support for the R6RS `library' and `import' forms -;; Copyright (C) 2010, 2019 Free Software Foundation, Inc. +;; Copyright (C) 2010, 2019, 2023 Free Software Foundation, Inc. ;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -44,9 +44,9 @@ (define (srfi-name? stx) (syntax-case stx (srfi) ((srfi n rest ...) - (and (and-map sym? #'(rest ...)) - (or (n? #'n) - (colon-n? #'n)))) + (cond ((n? #'n) 'r7rs) + ((colon-n? #'n) 'r6rs) + (else #f))) (_ #f))) (define (module-name? stx) @@ -85,10 +85,19 @@ (module-and-uses mod))) (syntax-case import-spec (library only except prefix rename srfi) - ;; (srfi :n ...) -> (srfi srfi-n ...) + ;; XXX: This is R7RS-specific, but it's here since we want the + ;; `import' procedure below to accept (srfi 64) as well as + ;; (srfi :64). + ;; ;; (srfi n ...) -> (srfi srfi-n ...) ((library (srfi n rest ... (version ...))) - (srfi-name? #'(srfi n rest ...)) + (eq? 'r7rs (srfi-name? #'(srfi n rest ...))) + (let ((srfi-n (make-srfi-n #'srfi #'n))) + (resolve-r6rs-interface + #`(library (srfi #,srfi-n rest ... (version ...)))))) + ;; (srfi :n ...) -> (srfi srfi-n ...) + ((library (srfi n rest ... (version ...))) + (eq? 'r6rs (srfi-name? #'(srfi n rest ...))) (let ((srfi-n (make-srfi-n #'srfi #'n))) (resolve-r6rs-interface (syntax-case #'(rest ...) () @@ -98,7 +107,7 @@ ;; SRFI 97 says that the first identifier after the `n' ;; is used for the libraries name, so it must be ignored. #`(library (srfi #,srfi-n rest ... (version ...)))))))) - + ((library (name name* ... (version ...))) (and-map sym? #'(name name* ...)) (resolve-interface (syntax->datum #'(name name* ...)) @@ -107,7 +116,7 @@ ((library (name name* ...)) (and-map sym? #'(name name* ...)) (resolve-r6rs-interface #'(library (name name* ... ())))) - + ((only import-set identifier ...) (and-map sym? #'(identifier ...)) (let* ((mod (resolve-r6rs-interface #'import-set)) @@ -121,7 +130,7 @@ (hashq-set! (module-replacements iface) sym #t))) (syntax->datum #'(identifier ...))) iface)) - + ((except import-set identifier ...) (and-map sym? #'(identifier ...)) (let* ((mod (resolve-r6rs-interface #'import-set)) @@ -182,7 +191,7 @@ (module-remove! iface from) (hashq-remove! replacements from) (lp (cdr in) (cons (vector to replace? var) out)))))))) - + ((name name* ... (version ...)) (module-name? #'(name name* ...)) (resolve-r6rs-interface #'(library (name name* ... (version ...))))) @@ -196,45 +205,11 @@ (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))))))) + (syntax-case stx () + ((name name* ...) + (and-map sym? #'(name name* ...))) + (_ #f))) (define (compute-exports ifaces specs) (define (re-export? sym) @@ -282,17 +257,6 @@ (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 ...) @@ -328,7 +292,7 @@ (export! x ...) (@@ @@ (name name* ...) body) ...)))))))) - + (define-syntax import (lambda (stx) (define (strip-for import-set) @@ -343,7 +307,7 @@ #'(eval-when (expand load eval) (let ((iface (resolve-r6rs-interface 'library-reference))) (call-with-deferred-observers - (lambda () - (module-use-interfaces! (current-module) (list iface))))) + (lambda () + (module-use-interfaces! (current-module) (list iface))))) ... (if #f #f))))))) diff --git a/module/ice-9/r7rs-libraries.scm b/module/ice-9/r7rs-libraries.scm index 97465b649..773a9d47b 100644 --- a/module/ice-9/r7rs-libraries.scm +++ b/module/ice-9/r7rs-libraries.scm @@ -31,6 +31,36 @@ (define-syntax define-library (lambda (stx) + (define (r7rs-module-name->r6rs-module-name name) + ;; This is a hack to support (srfi N x ...) modules in R7RS. The + ;; longer term solution would be to add support at the level of + ;; resolve-interface (bug #40371). + (define (n? stx) + (let ((n (syntax->datum stx))) + (and (exact-integer? n) + (not (negative? n))))) + + (define (srfi-name? stx) + (syntax-case stx (srfi) + ((srfi n rest ...) + (n? #'n)) + (_ #f))) + + (define (make-srfi-n context n) + (datum->syntax + context + (string->symbol + (string-append + "srfi-" + (let ((n (syntax->datum n))) + (number->string n)))))) + + (syntax-case name (srfi) + ;; (srfi n ...) -> (srfi srfi-n ...) + ((srfi n rest ...) (srfi-name? #'(srfi n rest ...)) + #`(srfi #,(make-srfi-n #'srfi #'n) rest ...)) + (_ name))) + (define (handle-includes filenames) (syntax-case filenames () (() #'()) @@ -105,12 +135,26 @@ #'(rename (from-identifier to-identifier))) (identifier #'identifier))) + (define (r7rs-import->r6rs-import import-set) + ;; Normalize SRFI names. + (syntax-case import-set (only except prefix rename) + ((only import-set identifier ...) + #`(only #,(r7rs-import->r6rs-import #'import-set) identifier ...)) + ((except import-set identifier ...) + #`(except #,(r7rs-import->r6rs-import #'import-set) identifier ...)) + ((prefix import-set identifier ...) + #`(prefix #,(r7rs-import->r6rs-import #'import-set) identifier ...)) + ((rename import-set (from-identifier to-identifier) ...) + #`(rename #,(r7rs-import->r6rs-import #'import-set) + (from-identifier to-identifier) ...)) + (_ (r7rs-module-name->r6rs-module-name import-set)))) + (syntax-case stx () ((_ name decl ...) (call-with-values (lambda () (partition-decls #'(decl ...) '() '() '())) (lambda (exports imports code) - #`(library name + #`(library #,(r7rs-module-name->r6rs-module-name #'name) (export . #,(map r7rs-export->r6rs-export exports)) - (import . #,imports) + (import . #,(map r7rs-import->r6rs-import imports)) . #,code))))))) diff --git a/test-suite/tests/rnrs-libraries.test b/test-suite/tests/rnrs-libraries.test index 86035e508..0fa7acb5c 100644 --- a/test-suite/tests/rnrs-libraries.test +++ b/test-suite/tests/rnrs-libraries.test @@ -205,9 +205,17 @@ (with-test-prefix "srfi" (pass-if "renaming works" (eq? (resolve-interface '(srfi srfi-1)) - (resolve-r6rs-interface '(srfi :1))) + (resolve-r6rs-interface '(srfi :1)) + (resolve-r6rs-interface '(srfi 1))) (eq? (resolve-interface '(srfi srfi-1)) - (resolve-r6rs-interface '(srfi :1 lists))))) + (resolve-r6rs-interface '(srfi :1 lists)) + (resolve-r6rs-interface '(srfi 1)))) + + (pass-if "import works" + (import (srfi srfi-1)) + (import (srfi :1)) + (import (srfi 1)) + #t)) (with-test-prefix "macro" (pass-if "multiple clauses" -- 2.41.0