[Openmcl-devel] Compiler warningsy

Taoufik Dachraoui taoufik.dachraoui at wanadoo.fr
Sun Oct 18 05:54:58 PDT 2009


On Oct 18, 2009, at 2:18 PM, Gary Byers wrote:

>
>
> On Sun, 18 Oct 2009, Taoufik Dachraoui wrote:
>
>> 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 doesn't "create variables"; it's a macro that expands into code
> that assigns values to "places".
But if there were no place it will create one. There were no place for  
x before setf and after
setf we have a place for x; and thats what i meant by setf creates a  
variable x. Somehow
after setf we have a place for x and it is not dynamic and it is not  
lexical; It behaves like a
lexical variable unless you declare it special.

>
>> ? (setf x 1)
>
> A perfectly reasonable way of determining the value of that (or any  
> other)
> toplevel expression is to compile a function whose definition is that
> expression and call that function.  CCL's EVAL function handles some  
> simple
> forms via other means (and this SETF is one of those simple cases).   
> Had CCL's
> EVAL function chosen to use the compiler:
>
> ? (funcall (compile nil `(lambda () (setf x 1))))
> ;Compiler warnings :
> ;   In an anonymous lambda form: Undeclared free variable X
>
> the compiler would have warned about X, which is not a special  
> variable,
> not lexically bound, and not a constant.  (It's not a symbol-macro  
> either,
> but it's probably wise for you to ignore that for now.)
>
> When CCL's EVAL handles the SETF form above, it -could- notice these  
> things
> about x and warn about them, but it happens not to, as others may  
> have noted
> and as I've said at least twice already in the last day or two.  As  
> I've noted at least twice already, there isn't a good reason for  
> this inconsistency.
>
> All you are seeing in the cases you cite as examples is different  
> warning
> behavior between builtin EVAL behavior and the CCL compiler.  In all  
> cases,
> references to X are anomalous; whether warnings are or are not  
> generated
> is just a case of inconsistent warning behavior between the built-in  
> evaluaator
> and the compiler.
>
> The different behaviors do not mean anything else, and they  
> certainly don't
> mean what you imagine they do.
>
Forget about warnings, I am talking about the seeable behavior of SETF  
and THE operators.
Before SETF there were no place for x, and after SETF there is a place  
and it is not
lexical nor dynamic. And the THE operator is not compliant with CLHS.

>> 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.
>
> People have been explaining this to you for a few days now.  At some  
> point,
> it'd probably be worth it for you to accept what they're saying and  
> try to
> understand it, since whatever it is that you're doing instead of  
> that doesn't
> seem to work very well.
>
I understand, to some level, how it is implemented now after their  
explanations and I
thank you all for that. But what I am saying is about compliance with  
CLHS.

>> 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
>>

Kind regards
Taoufi







More information about the Openmcl-devel mailing list