[gambit-list] eval order, define vs define-macro

Stephane Le Cornec coleste at videotron.ca
Thu May 11 16:19:35 EDT 2006


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.


-- 
Stephane!
coleste at videotron.ca (Stephane Le Cornec)
+------------------- Made with recycled electrons. --------------------+
| #include <disclaimer.h>                             Kebekkujin desu. |
+---------<http://www.starfiredesign.com/starfire/index.html>----------+


More information about the Gambit-list mailing list