Consider these two modules: --8<---------------cut here---------------start------------->8--- (define-module (a) #:use-module (b) #:export (from-a)) (define from-a 1) --8<---------------cut here---------------end--------------->8---
and: --8<---------------cut here---------------start------------->8--- (define-module (b) #:use-module ((a) #:select (from-a)) #:export (from-b)) (define from-b 2) --8<---------------cut here---------------end--------------->8--- This fails: --8<---------------cut here---------------start------------->8--- scheme@(guile-user)> ,use(a) While executing meta-command: ERROR: no binding `from-a' in module (a) --8<---------------cut here---------------end--------------->8--- whereas this succeeds (starting from a fresh Guile): --8<---------------cut here---------------start------------->8--- scheme@(guile-user)> ,use(b) scheme@(guile-user)> from-b $1 = 2 --8<---------------cut here---------------end--------------->8--- Problem is that ‘define-module*’ processes exports after imports. What about a patch along these lines:
diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index c825b35..24b8f4c 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -2872,11 +2872,8 @@ VALUE." (error "expected list of integers for version")) (set-module-version! module version) (set-module-version! (module-public-interface module) version))) - (let ((imports (resolve-imports imports))) (call-with-deferred-observers (lambda () - (if (pair? imports) - (module-use-interfaces! module imports)) (if (list-of valid-export? exports) (if (pair? exports) (module-export! module exports)) @@ -2885,6 +2882,9 @@ VALUE." (if (pair? replacements) (module-replace! module replacements)) (error "expected replacements to be a list of symbols or symbol pairs")) + (let ((imports (resolve-imports module))) + (if (pair? imports) + (module-use-interfaces! module imports))) (if (list-of valid-export? re-exports) (if (pair? re-exports) (module-re-export! module re-exports)) @@ -2896,7 +2896,7 @@ VALUE." ;; handlers. (if (pair? duplicates) (let ((handlers (lookup-duplicates-handlers duplicates))) - (set-module-duplicates-handlers! module handlers)))))) + (set-module-duplicates-handlers! module handlers))))) (if transformer (if (and (pair? transformer) (list-of symbol? transformer))
Thanks, Ludo’.