Hi. I'm writing a custom module system that avoids the standard search path and list-of-symbols naming scheme. Instead of using use-modules and define-module, I have a roughly similar procedure, let's call it my-load, that creates a module with make-module and loads a file into it with primitive-load. I want to make my-load automatically available within the modules I load so that they can use it to load other modules too. So my-load adds itself to each new module using module-define! before calling primitive-load.
This works when I run Guile with --no-auto-compile, but with compilation enabled, I get: ;;; Unbound variable: my-load How can I make the binding visible to the compiler? ;;main.scm (define (my-load path-to-macros) (let ((new-module (make-module 0 `(,(resolve-interface '(guile)))))) (module-define! new-module 'my-load my-load) (save-module-excursion (lambda () (set-current-module new-module) (primitive-load path-to-macros))) (let ((interface '(my-macro))) (for-each (lambda (sym) (module-define! (current-module) sym (module-ref new-module sym))) interface)))) (eval-when (compile load eval) (my-load "/path/to/macros1.scm")) (display (my-macro 5)) (newline) ;;macros1.scm (eval-when (compile load eval) (my-load "/path/to/macros2.scm")) (display (my-macro 3)) (newline) ;;macros2.scm (define-syntax my-macro (syntax-rules () ((_ x) (+ x x))))