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

Your annotation:

Enter a new annotation:

Your nick:
The title of your paste:
Your paste (mandatory) :
Which egg implements the CHICKEN wiki?
Visually impaired? Let me spell it for you (wav file) download WAV