Hi, [ CC'ing guix-devel@ because this functionality could be useful in Guix package definitions ] Currently, use-modules cannot be meaningfully used inside procedures, unless '(current-module)' is always the module in which the procedure is defined. I wondered if some kind of 'lexical use-modules' was possible, with sufficient macroology and module reflection, and it looks like it is: (use-modules (srfi srfi-1)) (define-syntax use-module/lexical ;; todo: integrate into (use-modules ...)? (lambda (s) (syntax-case s () ((_ foo) (let* ((module-name (syntax->datum #'foo)) (interface (resolve-interface module-name))) (define (binding->import name variable) (define name-syntax (datum->syntax s name)) #`(define-syntax #,name-syntax (identifier-syntax (@ foo #,(datum->syntax #'irrelevant name))))) #`(begin #,@(module-map binding->import interface))))))) (define &exception 'top-level) (let () (use-module/lexical (ice-9 exceptions)) (pk 'inner &exception raise-continuable)) ;;; (inner # #) (pk 'outer &exception) ;;; (outer top-level) (pk 'unbound-variable raise-continuable) ;; a backtrace! Limitation: things like (define (foo) (use-module/lexical (platform-specific-constants)) (if on-linux? CONSTANT_ONLY_DEFINED_ON_LINUX CONSTANT_ONLY_DEFINED_ON_HURD)) won't work in cross-compilation contexts. Greetings, Maxime.