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