<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  
</head>
<body text="#000000" bgcolor="#ffffff">
<br>
<br>
Tim Bradshaw wrote:<br>
<blockquote type="cite" cite="mid:40B3FFEE-DDD2-4564-8212-DDD2ABBBF248@tfeb.org">
  <pre wrap=""><!---->
One of the most annoying things about SETF at the top-level in CMUCL  
is that it does (or did) effectively declare the name as special.   
That can have fairly pervasive and unfortunate side-effects.

So it's a good thing it does not do this in CCL.</pre>
</blockquote>
I agree strongly.  In fact, having SETF at top level<br>
cause a declaration to happen is extremely confusing.<br>
<br>
This is a much more profound issue than the question<br>
of when warnings are emitted.  The warnings are less<br>
profound because they do not actually have any effect<br>
on the outcome of the program.<br>
<br>
In Taoufik's defense, this stuff really is pretty confusing.<br>
First, the CMUCL behavior makes it very different from<br>
anything else.  Second, I can see how it would be easy<br>
to think that the presence or absence of warnings meant<br>
something more than it actually did.  Third, even I am<br>
finding that I have trouble explaining this, even though<br>
I have co-authored or closely edited at least three texts<br>
on Lisp that try to explain all this!  (And I agree with<br>
Ron that this all reflects poorly on the clarity of<br>
the language design; it's all due to unfortunate<br>
ancient history.)<br>
<br>
Ignoring symbol macros (since that's orthogonal)<br>
for simplicity and brevity:<br>
<br>
The following is not stringent and precise, so please<br>
don't pick over details if they aren't really germane<br>
to the point I'm trying to make; thanks in advance.<br>
<br>
Whenever Common Lisp sees a symbol being used<br>
as a variable, which means evaluting it or binding<br>
it or setting it, it has to decide whether this is a<br>
"lexical" or "dynamic" ("special") reference.<br>
<br>
Basically, if the current declaration context says<br>
that the symbol is declared "special", it's taken<br>
as a special reference.  I think the best way to say<br>
it is that evaluation treats the symbol as the name<br>
of a dynamic variable, and then that evaluation is<br>
getting the value of that dynamic variable.  Binding<br>
is doing a "dynamic bind" of the dynamic variable.<br>
<br>
If the symbol is not declared special, then the<br>
symbol is treated as the name of a lexical variable<br>
from some lexically enclosing context (the "innermost"<br>
one).<br>
<br>
If the symbol isn't declared special and there isn't<br>
any lexically enclosing context providing a variable<br>
named by that symbol, what happens?<br>
<br>
In a comopiled program, usually such a circumstance<br>
is interpreted as being an invalid program; it's an<br>
error.  This is what happens if you accidentally<br>
mis-spell a variable name (unless there really is<br>
something spelled that way, of course).<br>
<br>
But traditionally it's been possible to just walk<br>
up to a Lisp REPL and start doing things like<br>
<br>
(setq z 4)<br>
<br>
and expect to "globally set z to 4".  That can only happen<br>
if z is treated as a special variable.  CMUCL actually<br>
declares the symbol z to be special, side-effecting the global<br>
environment, which means any future references to<br>
z as a variable, even if they could have been interpreted as lexical,<br>
will now be interpreted as special.  CCL doesn't do<br>
that, and I don't think other implementations do either.<br>
<br>
So (as I understand it) CCL in this case interprets z as<br>
special, but does not declare the symbol z to be special,<br>
so any code in the future that uses z in a normal lexical<br>
way will do what it would have done in the absence<br>
of the "setq" that happened at top level.<br>
<br>
Note: Talking about Lisp "creating a variable" can be<br>
confusing.  Symbols are created by the reader, at<br>
read time.  Symbols can be used for many things.<br>
Sometimes, symbols are interpreted as variables,<br>
depending on the context in which they are seen.<br>
There isn't quite anything that is best called "creating<br>
a variable".<br>
<br>
I hope this helps.<br>
<br>
-- Dan<br>
<br>
<br>
<br>
<br>
</body>
</html>