Subject: Re: "Wrong" results from _Common LISPcraft_ scope example
From: Erik Naggum <clerik@naggum.no>
Date: 1998/09/26
Newsgroups: comp.lang.lisp
Message-ID: <3115842049861794@naggum.no>
* mcfarlan@neca.com (D. Michael McFarland)
| I'd appreciate any insights anyone can offer into which result is
| "correct", how two CL implementations can differ on what seems a
| fundamental point, or what I could have done wrong.
it was a really bad example. it tried to show you that the SUM in
SUM-AVERAGE-CALLER is not the same SUM as that in SUM-AVERAGE, but it
attempts to use a "global, non-special variable", and those do not
actually exist in Common Lisp.
the example depends on the effects of the form (setq sum '(a b c)) when
evaluated at top-level. CMUCL marks SUM as special, in effect performs a
DEFVAR, which means SUM-AVERAGE-CALLER actually _binds_ the SUM that
SUM-AVERAGE sets, so the outermost (= global) binding is not affected.
CLISP and Wilensky assume that it is valid for a variable to be assigned
a value in the top-level loop without being special.
the reasonable behavior is to assume that a variable that is not closed
over lexically has a special binding. if setting the value of a
previously unbound symbol also causes it to be marked special in the
top-level loop, I'd consider that a nicety of the implementation for most
uses, but is by no means a requirement, and good Common Lisp programmers
never rely on the effects of such operations, anyway. one could also
argue that it would be a pain to declare variables you set at top-level
special just because you need them to have some value when testing code,
and I have come to think this is why some implementations don't do it.
but, come to think of it, CMUCL prints a warning that it declares such a
variable special, which you _should_ have noticed -- it's what lawyers
call "material evidence". :)
#:Erik