[-- Attachment #1: Type: text/plain, Size: 2945 bytes --] Hello, Guile 3.0 The module-use! 'target' functionality is broken The code of module-use! itself didn't change, and call(s) to the procedure work(s) fine, but the functionality it is supposed to provide is broken. To reproduce, save the following minimalist module somewhere: ;; start here (define-module (a) #:use-module (srfi srfi-1)) (eval-when (expand load eval) (module-use! (module-public-interface (current-module)) (resolve-interface '(srfi srfi-1)))) ;; end here ;; then, fire a 3.0 repl: (add-to-load-path "/your/path") ,use (a) map [ below, my attempts using Guile 3.0.4.3-e076a5, then Guile [ 2.2.7.2-a5875-dirty to compare. Fwiw: (a) G-Golf extensively relies on the module-use! functionality 'in general', and in particular, on its 'dynamic' implementation - that is, the public interface of a module that has been 'module-used' may evolve in time (at the 'essence' of any GI dynamic binding); (b) just like for the minimalist module (a) above, but it will do so 'dynamically', G-Golf needs that the public interface of a module that has been 'module-used' may re-export-and-replace a guile core procedure (generally promoted as a generic function, with the core proc as its default method). Thanks, David GNU Guile 3.0.4.3-e076a5 ... scheme@(guile-user)> (add-to-load-path "/home/david/alto/projects/g-golf/3.0") scheme@(guile-user)> ,use (a) ;;; 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]> GNU Guile 2.2.7.2-a5875-dirty ... 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 ;;; 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)> [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #1: Type: text/plain, Size: 2084 bytes --] Hello, > ... > (define-module (a) > #:use-module (srfi srfi-1)) > (eval-when (expand load eval) > (module-use! (module-public-interface (current-module)) > (resolve-interface '(srfi srfi-1)))) > ... Commit 19f38a38fde7da5fbcf29d0ebc4574e993210110 fixes the bug, many thanks. Now, I have a question related to 'new' warnings though - I say 'new' because there are no warnings in 2.2 - for which I don't see how one can resolve those, unless mute them all by calling default-duplicate-binding-handler and remove warn-override-core and warn from the default list. Here is a example, so one can reproduce and maybe give us some hints: ;;; module (a) starts here (define-module (foo) #:use-module (srfi srfi-1)) (eval-when (expand load eval) (module-use! (module-public-interface (current-module)) (resolve-interface '(srfi srfi-1)))) (for-each display '(1 2 3 4)) (newline) ;;; module (foo) ends here ;;; file bar.scm starts here - not a module, just a file (use-modules (foo)) #;(eval-when (expand load eval) (default-duplicate-binding-handler '(replace last))) (for-each display '(5 6 7 8)) (newline) ;; drop the two above module/file somwhere ;;; now, fire geiser and (add-to-load-path "/your/path") (load "/your/path/bar.scm") ;; you should see that there is no warning 'from (foo)', but two ;; warnings WARNING: (guile-user): imported module (a) overrides core binding `for-each' ;; 'from the bar.scm file (one when it compiles, one when it 'runs' ... ;; if you start a new session, then there should be one warning only ... Now, if we uncomment the eval-when in bar.scm and try again, all is fine But i wish the module-use! interface/internals would be enhanced so that it does the same thing for module-use! then what is done simply using #:use-module... and allow us to keep warn-override-core and warn in the default-duplicate-binding-handler list ... not sure i made myself clear, but trying :) David [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #1: Type: text/plain, Size: 1493 bytes --] Hello, > ... > Commit 19f38a38fde7da5fbcf29d0ebc4574e993210110 fixes the > bug, many thanks. > Now, I have a question related to 'new' warnings though - I say 'new' > because there are no warnings in 2.2 - for which I don't see how one > can resolve those, unless mute them all by calling > default-duplicate-binding-handler and remove warn-override-core > and warn from the default list. The proper way to stop these warnings is to add a #:re-export-and-replace clause to the module definition of the module that calls module-use! - I didn't think I had to do this because we didn't have to using 2.2 (nor #:re-export nor #:replace, within the context of module-use! that is, and the #:re-export-and-replace clause is new to 3.0) - like this: ;;; module (a) starts here (define-module (foo) #:use-module (srfi srfi-1)) #:re-export-and-replace (for-each)) (eval-when (expand load eval) (module-use! (module-public-interface (current-module)) (resolve-interface '(srfi srfi-1)))) ;;; module (foo) ends here Now the (bar) module or bar.scm file example file may skip the call to default-duplicate-binding-handler: ;;; file bar.scm starts here (use-modules (foo)) (for-each display '(5 6 7 8)) (newline) ;; file bar.scm stops here ;; drop the two above module/file somwhere ;;; now, fire geiser and (add-to-load-path "/your/path") (load "/your/path/bar.scm") ;; you shouldn't see any warnings anymore... David [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 488 bytes --]