[gambit-list] AWS, Termite, and Snow

Marc Feeley feeley at iro.umontreal.ca
Sat Feb 2 22:47:54 EST 2008


On 2-Feb-08, at 6:35 PM, James Long wrote:

> For example, the
> following simple scenario doesn't work with gambit:
>
> -- test.scm
>
> (namespace ("foo#"))
> (##include "~~/lib/gambit#.scm")
>
> (define a 5)
>
> (namespace ("bar#"))
> (##include "~~/lib/gambit#.scm")
> (namespace ("foo#" a))
>
> (eval '(display a))


Of course it doesn't work!  You are mixing two different levels of  
evaluation.  What you should have written is:

(namespace ("foo#"))
(##include "~~/lib/gambit#.scm")

(define a 5)

(eval
  '(let ()
     (namespace ("bar#"))
     (##include "~~/lib/gambit#.scm")
     (namespace ("foo#" a))
     (display a)))

Note that the semantics you were expecting requires dynamic binding.   
In other words, for the call to "eval", the caller's namespace  
environment must be accessed by the callee (eval in this case).  This  
inheritance of the namespace environment would be very messy.  For  
example consider:

(namespace ("foo#"))
(##include "~~/lib/gambit#.scm")

(define a 5)
(define e eval)
(define (f x) (e x))
(define (g) (f '(display a)))

(namespace ("bar#"))
(##include "~~/lib/gambit#.scm")
(namespace ("foo#" a g))

(define (f x) x)

(eval '(display a))
(g)

Does the call to g return the same result as the call to eval?  When g  
calls f, which f is called... foo#f or bar#f?  For lexical scoping we  
want it to call foo#f, but if the callee (i.e. g) inherits the  
namespace environment of the caller, then the f evaluated in g should  
resolve to foo#f.  This is madness!

Marc




More information about the Gambit-list mailing list