[Openmcl-devel] process-run-function and "dynamic vs lexical"

Greg Pfeil greg at clozure.com
Thu Oct 22 13:20:19 PDT 2009


On 22 Oct 2009, at 15:27, Taoufik Dachraoui wrote:

> ? (defvar x 2)
> X
> ? (let ((x 1))
>     (flet ((foo ()  x))
>        (let ((x 5)) (+ x (foo)))))
> 10
> ?
…
> After defining x using defvar, the let block do not follow the specs;
> in the specs,
> let creates a new variable binding and that binding is lexical unless
> the name
> is declared special.
>
> Now my question, how come at compile/eval time the foo function was  
> not
> lexically bound to the first  value of x within the let block (since x
> is the name
> of a new variable binding and it is lexical since there is no special
> declaration
> for x?).


On the DEFVAR page of CLHS, there's a sample implementation of DEFVAR  
that DECLAIMs the name SPECIAL. So there _is_ a special declaration  
for X. It's just not a "lexical" declaration, but rather a declaration  
in the global environment.

I agree that this is confusing and unpredictable behavior, but it's  
behavior that the spec requires and that every CL impl provides. This  
is why we have the *X* convention.


More information about the Openmcl-devel mailing list