At 11:17 -0400 2006/05/11, Marc Feeley wrote: <snip>
Assume the following code is in the file "test.scm":
(define (foo x) x) (define-macro (bar x) `(+ ,x ,(foo x))) (define (baz x) (bar x))
and you compile this code with
gsc -dynamic test.scm
and then run the code with
gsi test.o1
Ask yourself when the variables foo and baz will be set.
<snip>
Does that clarify things?
The reason why this is counterintuitive is that macros give the illusion that function definitions and macro definitions are evaluated in the same "world". Although the same language is used, there are really two worlds: the run time world and the expansion time world. This makes it hard to write macros that need to share some expansion time function or state. Here's one way to achieve this.
(define-macro (at-expand-time expr) (eval expr) `(begin))
(at-expand-time (define (foo x) x)) (define-macro (bar x) `(+ ,x ,(foo x))) (define (baz x) (bar x))
Yes, thank you. It is interesting.
I see that macros are removed from the runtime state. If you add a REPL in the file, (foo 3) and (baz 3) work but (bar 3) fails. The "side-effect" of the at-expand-time macro survived but not the macros themselves.