[gambit-list] How to load syntax definitions?

Marc Feeley feeley at iro.umontreal.ca
Mon Jan 16 14:11:15 EST 2012


On 2012-01-16, at 1:34 PM, Sascha Ziemann wrote:

> I have a problem loading a file which defines syntax. It does not work
> in Gambit although it works in other Schemes.
> 
> This is file x.scm:
> 
> (define-syntax x
>  (syntax-rules ()
>    ((_) (display "x\n"))))
> (load "y.scm")
> (x)
> (y)
> 
> And this is y.scm:
> 
> (define-syntax y
>  (syntax-rules ()
>    ((_) (display "y\n"))))
> 
> When I run Gambit I get an error:
> 
> $ gsi -:s x.scm
> x
> *** ERROR IN "x.scm"@8.2 -- Unbound variable: y
> 
> But this works in Gauche, Bigloo and Chicken:
> 
> $ gosh x.scm
> x
> y
> 
> $ bigloo -s -i x.scm
> x
> y
> 
> $ csi -qb x.scm
> x
> y
> 
> Who is right?

Gambit takes the point of view that syntax definitions are local to a file.  This makes sense for a compiled language.  After all "load" is a procedure which executes at *run* time.  So in that context in the code:

(define-syntax x
 (syntax-rules ()
   ((_) (display "x\n"))))
(load "y.scm")
(x)
(y)

you wouldn't expect that the meaning of the macro call (y) depends on what was loaded by the (load "y.scm").  Otherwise it would be impossible to compile code efficiently.  The compiler would have to defer to run time most of the decisions which are normally done at compile time.

If you want to reuse the macro definitions from another file, just "include" that file.

I'm curious...  what happens in gauche, bigloo and chicken when file x.scm is compiled?  What is the behaviour when you execute the compiled file?  My guess is that the semantics of the compiler and interpreter are inconsistent on those Scheme implementations.

Marc




More information about the Gambit-list mailing list