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

Greg Pfeil greg at clozure.com
Thu Oct 22 09:08:09 PDT 2009

On 22 Oct 2009, at 11:42, Taoufik Dachraoui wrote:

> Just for completeness I include the example:
> ? (defvar y 1)
> Y
> ? (let ((x 2) (y 3))
>    (labels ((f () (format t "~%x=~A y=~A~%" x y)))
>      (ccl:process-run-function "test" #'f)))
> #<PROCESS test(3) [Reset] #x8D43546>
> ?
> x=2 y=1
> ?
> let creates new variable binding for the names x and y and these
> bindings are lexical unless they are declared special.
> Where is my mistake, please note here that I would like to reconcile
> my understanding with what I see while running ccl code.

If you check Ron's guide to specials (http://www.flownet.com/ron/specials.pdf 
), the section "The pervasiveness of DEFVAR" explains what you're  

"Because DEFVAR does more than just establish a dynamic binding for X.  
It pervasively declares all references to X and all subsequent  
bindings for X to be dynamic (or special -- same thing). In other  
words, DEFVAR turns its argument (permanently and pervasively) into a  
special variable."

So the Y <= 3 binding is actually for the special variable, but the  
binding of the 3 is thread-local, so your function run in its own  
thread still sees the value 1.

More information about the Openmcl-devel mailing list