[Openmcl-devel] Absolute beginner

Stephen Ng stephen.ng at planetnutek.com
Thu Apr 9 05:45:48 PDT 2009


Thanks for taking the time to explain.


On 09/04/2009, at 12:11 AM, mikel evins wrote:

>
> On Apr 8, 2009, at 10:36 AM, Stephen Ng wrote:
>
>> Hi!
>>
>> I am going through a tutorial on Lisp using Clozure CL and came  
>> across
>> a warning message and wonder if someone can explain it to me -
>>
>> ? (setf bag 2)
>> 2
>> ? (dotimes (x 6) (setf bag (* bag bag)))
>> ;Compiler warnings :
>> ;   In an anonymous lambda form: Undeclared free variable BAG (3
>> references)
>> NIL
>> ? bag
>> 18446744073709551616
>
>
> A variable whose definition isn't in the present scope is called a  
> "free variable". For example, in
>
> (+ 2 j)
>
> the j is a free variable. We can't tell from looking at that snippet  
> alone whether j has a definition. In your example above, bag is a  
> free variable. It so happens that in your code everything is fine,  
> because you previously used SETF to establish a binding for bag in  
> the enclosing scope, but the compiler can't tell that just from  
> looking at the expression
>
>  (dotimes (x 6) (setf bag (* bag bag)))
>
> Since it can't tell just from looking at that expression whether you  
> meant for bag to refer to something that was previously defined  
> somewhere else, it warns you about the free variable. It goes ahead  
> and compiles the code, and runs it just fine (because it so happened  
> that there was an appropriate definition of bag in the enclosing  
> scope), but in general the compiler can't know that, and it's pretty  
> common that undeclared free variables are actually errors (typos, or  
> accidental uses of variables that are out of scope, or other such  
> mistakes), so when the compiler encounters you, it warns you before  
> continuing, in case there's something you need to fix.
>
> --me
>
>




More information about the Openmcl-devel mailing list