* bug#43025: re-export-public-interface fails on Guile 3 @ 2020-08-24 16:11 Dale Smith 2020-08-24 19:50 ` Leo Prikler 2021-03-12 14:12 ` Dale Smith 0 siblings, 2 replies; 8+ messages in thread From: Dale Smith @ 2020-08-24 16:11 UTC (permalink / raw) To: 43025 This is actually reported by daviid on IRC. This definition of re-export-public-interface works fine on Guile 2.x, fails with Guile 3: (hope this makes it through the mails cleanly) ;;; ;;; re-export-public-interface ;;; (define-module (modules) #:export (re-export-public-interface)) (define-macro (re-export-public-interface . args) "Re-export the public interface of a module or modules. Invoked as @code{(re-export-public-interface (mod1) (mod2)...)}." (if (null? args) '(if #f #f) `(begin ,@(map (lambda (mod) (or (list? mod) (error "Invalid module specification" mod)) `(module-use! (module-public-interface (current-module)) (resolve-interface ',mod))) args)))) ;;; ;;; A module that uses the above ;;; (define-module (a) #:use-module (srfi srfi-1) #:use-module (modules) #:export (map-a)) (eval-when (expand load eval) (re-export-public-interface (srfi srfi-1))) (define (map-a) (map (lambda (item) (display item) (display " ")) (iota 5)) (newline) (values)) ;;; ;;; A 3.0.4 repl session ;;; GNU Guile 3.0.4.3-e076a5 Copyright (C) 1995-2020 Free Software Foundation, Inc. Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. This program is free software, and you are welcome to redistribute it under certain conditions; type `,show c' for details. Enter `,help' for help. scheme@(guile-user)> (add-to-load-path "/home/david/alto/projects/g-golf/3.0") scheme@(guile-user)> ,use (a) ;;; note: source file /home/david/alto/projects/g-golf/3.0/a.scm ;;; newer than compiled /home/david/.cache/guile/ccache/3.0-LE-8-4.3/usr/alto/projects/g-golf/3.0/a.scm.go ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the --no-auto-compile argument to disable. ;;; compiling /home/david/alto/projects/g-golf/3.0/a.scm ;;; compiled /home/david/.cache/guile/ccache/3.0-LE-8-4.3/usr/alto/projects/g-golf/3.0/a.scm.go scheme@(guile-user)> map WARNING: (guile-user): imported module (a) overrides core binding `map' WARNING: (guile-user): `map' imported from both (guile) and (a) WARNING: (guile-user): imported module (a) overrides core binding `map' WARNING: (guile-user): `map' imported from both (guile) and (a) ;;; <unknown-location>: warning: possibly unbound variable `map' WARNING: (guile-user): imported module (a) overrides core binding `map' WARNING: (guile-user): `map' imported from both (guile) and (a) WARNING: (guile-user): imported module (a) overrides core binding `map' WARNING: (guile-user): `map' imported from both (guile) and (a) ice-9/boot-9.scm:1670:16: In procedure raise-exception: Unbound variable: map Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue. scheme@(guile-user) [1]> ;;; ;;; Just to compare, a 2.2.7 session ;;; How to achieve the same using 3.0.4 is the ;;; objective ... Press C-c C-z to bring me back. GNU Guile 2.2.7.2-a5875-dirty Copyright (C) 1995-2019 Free Software Foundation, Inc. Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. This program is free software, and you are welcome to redistribute it under certain conditions; type `,show c' for details. Enter `,help' for help. scheme@(guile-user)> (add-to-load-path "/home/david/alto/projects/g-golf/3.0") scheme@(guile-user)> ,use (a) ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the --no-auto-compile argument to disable. ;;; compiling /home/david/alto/projects/g-golf/3.0/a.scm ;;; compiling /home/david/alto/projects/g-golf/3.0/modules.scm ;;; compiled /home/david/.cache/guile/ccache/2.2-LE-8-3.A/usr/alto/projects/g-golf/3.0/modules.scm.go ;;; compiled /home/david/.cache/guile/ccache/2.2-LE-8-3.A/usr/alto/projects/g-golf/3.0/a.scm.go scheme@(guile-user)> map $2 = #<procedure map (f l) | (f l1 l2) | (f l1 . rest)> ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#43025: re-export-public-interface fails on Guile 3 2020-08-24 16:11 bug#43025: re-export-public-interface fails on Guile 3 Dale Smith @ 2020-08-24 19:50 ` Leo Prikler 2020-08-26 16:51 ` Dale Smith 2021-03-12 14:12 ` Dale Smith 1 sibling, 1 reply; 8+ messages in thread From: Leo Prikler @ 2020-08-24 19:50 UTC (permalink / raw) To: dalepsmith, 43025 Hi Dale. Am Montag, den 24.08.2020, 12:11 -0400 schrieb Dale Smith: > This is actually reported by daviid on IRC. > > This definition of re-export-public-interface works fine on Guile > 2.x, > fails with Guile 3: > (hope this makes it through the mails cleanly) > ;;; > ;;; re-export-public-interface > ;;; > > [...] I'm going to skip the specifics of the macro here, it is not needed for an MWE. > ;;; > ;;; A module that uses the above > ;;; > > > (define-module (a) > #:use-module (srfi srfi-1) > #:use-module (modules) > > #:export (map-a)) > > > (eval-when (expand load eval) > (re-export-public-interface (srfi srfi-1))) > > > (define (map-a) > (map (lambda (item) > (display item) > (display " ")) > (iota 5)) > (newline) > (values)) > For the sake of minimalism, I will shorten this to (define-module (a)) (module-use! (module-public-interface (current-module)) (resolve-interface '(srfi srfi-1))) I hope you don't mind. > [sessions] My solution for this problem would be to build on some of the module "intrinsics", which sadly are not all that well documented. (define-module (a)) (let ((obs (module-obarray (resolve-interface '(srfi srfi-1)))) (iface (module-public-interface (current-module)))) (hash-fold (lambda (key value seed) (module-add! iface key value) seed) *unspecified* obs)) If you want to make this a macro, you really only need to syntax- unquote a module into the (resolve-interface ...) portion of this snippet. Some sessions for reference: GNU Guile 3.0.4 Copyright (C) 1995-2020 Free Software Foundation, Inc. Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. This program is free software, and you are welcome to redistribute it under certain conditions; type `,show c' for details. Enter `,help' for help. scheme@(guile-user)> (add-to-load-path "/tmp") scheme@(guile-user)> ,use (a) ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the --no-auto-compile argument to disable. ;;; compiling /tmp/a.scm ;;; compiled $HOME/.cache/guile/ccache/3.0-LE-8-4.3/tmp/a.scm.go scheme@(guile-user)> map WARNING: (guile-user): imported module (a) overrides core binding `map' $1 = #<procedure map (f l) | (f l1 l2) | (f l1 . rest)> scheme@(guile-user)> ,q GNU Guile 3.0.2 Copyright (C) 1995-2020 Free Software Foundation, Inc. Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. This program is free software, and you are welcome to redistribute it under certain conditions; type `,show c' for details. Enter `,help' for help. scheme@(guile-user)> (add-to-load-path "/tmp") scheme@(guile-user)> ,use (a) ;;; note: source file /tmp/a.scm ;;; newer than compiled /home/yuri/.cache/guile/ccache/3.0-LE-8- 4.2/tmp/a.scm.go ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the --no-auto-compile argument to disable. ;;; compiling /tmp/a.scm ;;; compiled $HOME/.cache/guile/ccache/3.0-LE-8-4.2/tmp/a.scm.go scheme@(guile-user)> map WARNING: (guile-user): imported module (a) overrides core binding `map' $1 = #<procedure map (f l) | (f l1 l2) | (f l1 . rest)> scheme@(guile-user)> ,q GNU Guile 2.2.7 Copyright (C) 1995-2019 Free Software Foundation, Inc. Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. This program is free software, and you are welcome to redistribute it under certain conditions; type `,show c' for details. Enter `,help' for help. scheme@(guile-user)> (add-to-load-path "/tmp") scheme@(guile-user)> ,use (a) ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the --no-auto-compile argument to disable. ;;; compiling /tmp/a.scm ;;; compiled $HOME/.cache/guile/ccache/2.2-LE-8-3.A/tmp/a.scm.go scheme@(guile-user)> map $1 = #<procedure map (f l) | (f l1 l2) | (f l1 . rest)> scheme@(guile-user)> ,q Interestingly, versions newer than 3.0.2 warn about core override in this case, as does #:re-export. If I am not mistaken, this is the way re-export works for variables normally. module-use! on the other hand does not modify the module-obarray, it instead adds the module to a list of uses, which are handled separately in variable lookup during `module_imported_variable`. This C function does look up variables exported by a module, but does not traverse module-uses recursively. I have no idea, how this works for 2.2.7, I only checked the Guile 3 code here. Regards, Leo ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#43025: re-export-public-interface fails on Guile 3 2020-08-24 19:50 ` Leo Prikler @ 2020-08-26 16:51 ` Dale Smith 2020-08-26 17:06 ` Leo Prikler 2020-08-27 2:21 ` Dale Smith 0 siblings, 2 replies; 8+ messages in thread From: Dale Smith @ 2020-08-26 16:51 UTC (permalink / raw) To: Leo Prikler; +Cc: 43025 On 8/24/20, Leo Prikler <leo.prikler@student.tugraz.at> wrote: > My solution for this problem would be to build on some of the module > "intrinsics", which sadly are not all that well documented. > > (define-module (a)) > > (let ((obs (module-obarray (resolve-interface '(srfi srfi-1)))) > (iface (module-public-interface (current-module)))) > (hash-fold > (lambda (key value seed) > (module-add! iface key value) > seed) > *unspecified* > obs)) > > If you want to make this a macro, you really only need to syntax- > unquote a module into the (resolve-interface ...) portion of this > snippet. So with that in mind, how about something like this (currently no error checking): (define-syntax re-export-public-interface (syntax-rules () ((_ mod ...) (let ((iface (module-public-interface (current-module)))) (module-for-each (lambda (sym val) (module-add! iface sym val) (hashq-set! (module-replacements iface) sym #t)) (resolve-interface 'mod)) ...)))) ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#43025: re-export-public-interface fails on Guile 3 2020-08-26 16:51 ` Dale Smith @ 2020-08-26 17:06 ` Leo Prikler 2020-08-27 2:21 ` Dale Smith 1 sibling, 0 replies; 8+ messages in thread From: Leo Prikler @ 2020-08-26 17:06 UTC (permalink / raw) To: Dale Smith; +Cc: 43025 Am Mittwoch, den 26.08.2020, 12:51 -0400 schrieb Dale Smith: > On 8/24/20, Leo Prikler <leo.prikler@student.tugraz.at> wrote: > > My solution for this problem would be to build on some of the > > module > > "intrinsics", which sadly are not all that well documented. > > > > (define-module (a)) > > > > (let ((obs (module-obarray (resolve-interface '(srfi srfi-1)))) > > (iface (module-public-interface (current-module)))) > > (hash-fold > > (lambda (key value seed) > > (module-add! iface key value) > > seed) > > *unspecified* > > obs)) > > > > If you want to make this a macro, you really only need to syntax- > > unquote a module into the (resolve-interface ...) portion of this > > snippet. > > So with that in mind, how about something like this (currently no > error checking): > > (define-syntax re-export-public-interface > (syntax-rules () > ((_ mod ...) > (let ((iface (module-public-interface (current-module)))) > (module-for-each > (lambda (sym val) > (module-add! iface sym val) > (hashq-set! (module-replacements iface) sym #t)) > (resolve-interface 'mod)) > ...)))) LGTM, but don't forget to test it ;) Also I'd call it `re-export-public-interface!', or even `re-export-and- replace-interface!' but that's a personal preference. ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#43025: re-export-public-interface fails on Guile 3 2020-08-26 16:51 ` Dale Smith 2020-08-26 17:06 ` Leo Prikler @ 2020-08-27 2:21 ` Dale Smith 2020-08-28 0:12 ` Dale Smith 1 sibling, 1 reply; 8+ messages in thread From: Dale Smith @ 2020-08-27 2:21 UTC (permalink / raw) To: Leo Prikler; +Cc: 43025 This seems to work for guile-2.2 and guile-3. Would be nice if it checked that module names look like lists. One step closer to g-golf working on guile-3! (define-syntax re-export-public-interface (syntax-rules () "Re-export the public interface of a module or modules. Invoked as @code{(re-export-public-interface (mod1) (mod2) ...)}." ((_ mod mods ...) (let ((iface (module-public-interface (current-module)))) (define (r-e-p-i module) (cond-expand (guile-3 (module-for-each (lambda (sym val) (hashq-set! (module-replacements iface) sym #t) (module-add! iface sym val)) (resolve-interface module))) (else (module-use! iface (resolve-interface module))))) (r-e-p-i 'mod) (r-e-p-i 'mods) ...)))) ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#43025: re-export-public-interface fails on Guile 3 2020-08-27 2:21 ` Dale Smith @ 2020-08-28 0:12 ` Dale Smith 2020-08-28 19:22 ` Dale Smith 0 siblings, 1 reply; 8+ messages in thread From: Dale Smith @ 2020-08-28 0:12 UTC (permalink / raw) To: Leo Prikler; +Cc: 43025 And here has some better error handling/reporting. (define-syntax re-export-public-interface (syntax-rules () "Re-export the public interface of a module or modules. Invoked as @code{(re-export-public-interface (mod1) (mod2) ...)}." ((_ (m0 m0* ...) (mn mn* ...) ...) (let ((iface (module-public-interface (current-module)))) (define (r-e-p-i module) (cond-expand (guile-3 (module-for-each (lambda (sym val) (hashq-set! (module-replacements iface) sym #t) (module-add! iface sym val)) (resolve-interface module))) (else (module-use! iface (resolve-interface module))))) (r-e-p-i '(m0 m0* ...)) (r-e-p-i '(mn mn* ...)) ...)) ((_) (syntax-violation 're-export-public-interface "must provide one or more module names" '(re-export-public-interface))) ((_ m m* ...) (syntax-violation 're-export-public-interface "module names must look like lists" '(re-export-public-interface m m* ...))))) ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#43025: re-export-public-interface fails on Guile 3 2020-08-28 0:12 ` Dale Smith @ 2020-08-28 19:22 ` Dale Smith 0 siblings, 0 replies; 8+ messages in thread From: Dale Smith @ 2020-08-28 19:22 UTC (permalink / raw) To: Leo Prikler; +Cc: 43025 And now using a more standard error reporting function. I think it's done now. (define-syntax re-export-public-interface (syntax-rules () "Re-export the public interface of a module or modules. Invoked as @code{(re-export-public-interface (mod1) (mod2) ...)}." ((_ (m0 m0* ...) (mn mn* ...) ...) (let ((iface (module-public-interface (current-module)))) (define (r-e-p-i module) (cond-expand (guile-3 (module-for-each (lambda (sym val) (hashq-set! (module-replacements iface) sym #t) (module-add! iface sym val)) (resolve-interface module))) (else (module-use! iface (resolve-interface module))))) (r-e-p-i '(m0 m0* ...)) (r-e-p-i '(mn mn* ...)) ...)) ((_) (syntax-error "must provide one or more module names")) ((_ m m* ...) (syntax-error "module names must look like lists")))) ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#43025: re-export-public-interface fails on Guile 3 2020-08-24 16:11 bug#43025: re-export-public-interface fails on Guile 3 Dale Smith 2020-08-24 19:50 ` Leo Prikler @ 2021-03-12 14:12 ` Dale Smith 1 sibling, 0 replies; 8+ messages in thread From: Dale Smith @ 2021-03-12 14:12 UTC (permalink / raw) To: 43025-close Closing this. Please see https://debbugs.gnu.org/cgi/bugreport.cgi?bug=47084 instead for a better/more accurate report. -Dale ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-03-12 14:12 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-08-24 16:11 bug#43025: re-export-public-interface fails on Guile 3 Dale Smith 2020-08-24 19:50 ` Leo Prikler 2020-08-26 16:51 ` Dale Smith 2020-08-26 17:06 ` Leo Prikler 2020-08-27 2:21 ` Dale Smith 2020-08-28 0:12 ` Dale Smith 2020-08-28 19:22 ` Dale Smith 2021-03-12 14:12 ` Dale Smith
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).