* 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).