[Openmcl-devel] Compiler warnings

Taoufik Dachraoui taoufik.dachraoui at wanadoo.fr
Sun Oct 18 04:14:03 PDT 2009


Also, I would like to insist on the fact that SETF creates a lexical  
variable (on behavior at least,
it is weird for me to say that because for me when I learned Common  
Lisp I was told that
there a daynamic and lexical variables).

The following example shows that SETF creates a lexical variable  
(because f always returns
the value of x as defined by SETF)

? (setf x 1)
1
? (defun f () (+ x 1))
;Compiler warnings :
;   In F: Undeclared free variable X
F
? (let ((x 5)) (f))
;Compiler warnings :
;   In an anonymous lambda form: Unused lexical variable X
2
? (defvar y 1)
Y
? (defun g () (+ 1 y))
G
? (let ((x 5) (y 10)) (values (f) (g)))
;Compiler warnings :
;   In an anonymous lambda form: Unused lexical variable X
2
11

If you do not agree please explain in more details so I learn and  
understand something new.

Taoufik

On Oct 18, 2009, at 1:05 PM, Taoufik Dachraoui wrote:

> Sorry but I have to insist.
>
> In the CL specs
>
> "the specifies that the values[1a] returned by form are of the types  
> specified by value-type.
> The consequences are undefined if any result is not of the declared  
> type."
>
> It is clear that (THE type expr)  specifies the the returned value  
> of expr is of type type.
>
> Again the example:
>
> ? (setf z 1)
> 1
> ? (the fixnum z)
> ;Compiler warnings :
> ;   In an anonymous lambda form: Undeclared free variable Z
> 1
> ? z
> 1
> ? (the fixnum 1)
> 1
> ?
>
> As you can see, after the SETF z has a value of 1 and (THE fixnum 1)  
> does not raise a
> warning but  (THE fixnum z) does, this means to me that the THE  
> operator does not
> merely uses the returned value of z but has something too say about  
> z, and this is wrong
> I believe.
>
> Taoufik
>
>
>
>
> On Oct 18, 2009, at 12:40 PM, Ron Garret wrote:
>
>>
>>
>> On Oct 18, 2009, at 3:28 AM, Taoufik Dachraoui wrote:
>>
>>> I am not talking about the warnings, warnings are sometimes  
>>> necessary, and I understand the
>>> difference between dynamic and lexical variables.
>>
>> But not, apparently, the difference between compile-time and run- 
>> time.
>>
>>> I am puzzled by the special operator THE as implemented in CCL.  
>>> Why the THE operator
>>> expects a special variable
>>
>> It doesn't.
>>
>>> and not simply specifies the value returned by the expression as
>>> described in the CLHS:
>>>
>>> again the example I gave shows the awkwardness:
>>>
>>> ? (setf x 3)
>>> 3
>>> ? (the fixnum x)
>>> ;Compiler warnings :
>>> ;   In an anonymous lambda form: Undeclared free variable X
>>> 3
>>> ? (defun f () x)
>>> ;Compiler warnings :
>>> ;   In F: Undeclared free variable X
>>> F
>>> ? (the fixnum (f))
>>>
>>> The last form shows that the THE operator did not care about the x  
>>> it just specified the
>>> value of the result without complaining, but if the expression  
>>> directly contain a non defined
>>> variable as in the first form, the THE operator raise a warning.
>>
>> This has nothing to do with THE.  This warning is generated by the  
>> compiler.  In CCL, most, but not all, expressions are compiled  
>> before they are run.  *Any* expression sufficiently complex to  
>> trigger a compilation will produce the warning:
>>
>> Welcome to Clozure Common Lisp Version 1.4-dev-r12726M-trunk   
>> (DarwinX8664)!
>> ? (setf x 1)
>> 1
>> ? (let ((y x)) y)
>> ;Compiler warnings :
>> ;   In an anonymous lambda form: Undeclared free variable X
>> 1
>> ? ((lambda () x))
>> ;Compiler warnings :
>> ;   In an anonymous lambda form: Undeclared free variable X
>> 1
>>
>> "THE" is a red-herring (except insofar as it is one of the forms  
>> that triggers a compilation rather than using the simple evaluator).
>>
>>> Also, two other things one again about the THE operator and one  
>>> about SETF.
>>>
>>> I would like to understand; what is the purpose of the THE  
>>> operator if it does not raise
>>> an error if the expression returns a value with a type different  
>>> from the specified one?
>>
>> It's to help the compiler produce more efficient code.
>>
>>> As you saw in the examples that I provided in my previous  
>>> submission, we see that CMUCL
>>> declares the variables defined by SETF as special (so dynamic),  
>>> unlike CCL the variables are not dynamic (but lexical, at least  
>>> they behave like that as I showed in the examples).
>>
>> No, you haven't, and they aren't.  See my earlier response to you  
>> in this thread.
>>
>> rg
>>
>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20091018/239eee4f/attachment.htm>


More information about the Openmcl-devel mailing list