(address . bug-guile@gnu.org)
Hello!
Consider this module:
Toggle snippet (5 lines)
(define-module (foo) #:autoload (does-not-exist) (baz))
(define (chbouib) (baz))
(pk 'hello)
Trying to evaluate it fails this way:
Toggle snippet (18 lines)
$ guile --no-auto-compile t.scm
Backtrace:
In ice-9/boot-9.scm:
[...]
292: 3 [get-global-definition-hook baz (hygiene foo)]
In unknown file:
?: 2 [module-variable #<directory (foo) b3b510> baz]
In ice-9/boot-9.scm:
2732: 1 [b #<autoload (does-not-exist) b3b3f0> baz #f]
In unknown file:
?: 0 [scm-error misc-error #f ...]
ERROR: In procedure scm-error:
ERROR: missing interface for module (does-not-exist)
... which defeats the whole purpose of autoloads.
What about something along these lines (untested)?
Toggle diff (29 lines)
diff --git a/module/ice-9/psyntax.scm b/module/ice-9/psyntax.scm
index 6c264a6..8a30f82 100644
--- a/module/ice-9/psyntax.scm
+++ b/module/ice-9/psyntax.scm
@@ -289,15 +289,20 @@
(lambda (symbol module)
(if (and (not module) (current-module))
(warn "module system is booted, we should have a module" symbol))
- (let ((v (module-variable (if module
+ (let ((m (if module
(resolve-module (cdr module))
- (current-module))
- symbol)))
+ (current-module))))
+ (case (module-kind m)
+ ((autoload)
+ ;; don't try to actually load the module
+ #t)
+ (else
+ (let ((v (module-variable m symbol)))
(and v (variable-bound? v)
(let ((val (variable-ref v)))
(and (macro? val) (macro-type val)
(cons (macro-type val)
- (macro-binding val)))))))))
+ (macro-binding val))))))))))))
(define (decorate-source e s)
Thanks,
Ludo’.