Welcome to the CHICKEN Scheme pasting service
Eval environment and modules pasted by alexcharlton on Sat May 24 18:20:48 2014
;;;; File module-a.scm ;;;; ;;;; Compiled with csc -s -J module-a.scm (module module-a * (import chicken scheme) (define-syntax define-number (ir-macro-transformer (lambda (e r c) `(begin (begin-for-syntax (define ,(strip-syntax (cadr e)) ,(caddr e))) (define ,(strip-syntax (cadr e)) ,(caddr e)))))) (define-syntax define-number-times-two (ir-macro-transformer (lambda (e r c) `(define ,(symbol-append (strip-syntax (cadr e)) '-times-two) ,(* (eval (cadr e)) 2))))) ;; define-number and define-number-times-two are expected to access the same object through its name ;; define-number defines the given name to be an object (for syntax so that it's visible at macro-expansion time) ;; define-number-times-two then evals the name to manipulate that object (define-syntax define-number-and-times-two (syntax-rules () [(_ name number) (begin (use module-a) (define-number name number) (define-number-times-two name))])) ) ;;;; END of module-a.scm ;;;; test.scm ;;;; ;;;; compiled with csc test.scm (module test * (import chicken scheme module-a) (define-number-and-times-two one 1) ;; This throws an error: ;; Error: during expansion of (define-number-times-two57 ...) - unbound variable: test#one (print one) (print one-times-two) ) ;; When you remove the test module, it works: #| (import chicken scheme module-a) (define-number-and-times-two one 1) (print one) ; -> 1 (print one-times-two) ; -> 2 |# ;; Clearly 'one' is being evaled in the wrong environment: Can this be fixed?
module-a updated with rename added by alex on Sat May 24 18:52:36 2014
;;;; File module-a.scm ;;;; ;;;; Compiled with csc -s -J module-a.scm (module module-a * (import chicken scheme) (define-syntax define-number (ir-macro-transformer (lambda (e rename c) `(begin (begin-for-syntax (define ,(rename (cadr e)) ,(caddr e))) (define ,(rename (cadr e)) ,(caddr e)))))) (define-syntax define-number-times-two (ir-macro-transformer (lambda (e rename c) `(define ,(symbol-append (rename (cadr e)) '-times-two) ,(* (eval (rename (cadr e))) 2))))) ;; define-number and define-number-times-two are expected to access the same object through its name ;; define-number defines the given name to be an object (for syntax so that it's visible at macro-expansion time) ;; define-number-times-two then evals the name to manipulate that object (define-syntax define-number-and-times-two (syntax-rules () [(_ name number) (begin (use module-a) (define-number name number) (define-number-times-two name))])) ) ;;;; END of module-a.scm