Hello! It seems that if you ‘set!’ a public variable of a declarative module, the change is visible to all the module users, but it’s not necessarily visible to procedures within that module, presumably because they use an inlined or specialized variant of that thing.
I would have imagined that public bindings are considered mutable and thus not subject to inlining; OTOH, that would obviously be a loss, so the current approach makes sense. Anyway, it complicates a use case for me. In Guix, we “mock” bindings like so: (define-syntax-rule (mock (module proc replacement) body ...) "Within BODY, replace the definition of PROC from MODULE with the definition given by REPLACEMENT." (let* ((m (resolve-interface 'module)) (original (module-ref m 'proc))) (dynamic-wind (lambda () (module-set! m 'proc replacement)) (lambda () body ...) (lambda () (module-set! m 'proc original))))) and that allows us to write tests that temporarily modify public (or private!) bindings. It seems like this could be addressed by compiling selected modules with ‘user-modules-declarative?’ set to #false, or by avoiding the above hack altogether when possible, but I thought I’d share my impressions and listen to what people think. :-) Thanks, Ludo’.