[alexandria-devel] [Sbcl-devel] How abour top-level setf = REPL-lexical variables?
Faré
fahree at gmail.com
Wed Oct 21 10:43:31 UTC 2009
2009/10/21 Stas Boukarev <stassats at gmail.com>:
> "Scott L. Burson" <Scott at sympoiesis.com> writes:
>
>> Historically and throughout most of the CL and pre-CL world -- at least, the MIT and MIT-influenced pole thereof -- the
>> practice has been, on a top-level interpreted SETQ of a previously unseen variable, to set the symbol-value of the variable
>> and do nothing else -- specifically, not to declare the variable special. MacLisp and ZetaLisp (Lisp Machine Lisp) did
>> this, and many important implementations still do: Allegro, LispWorks, the MCL family(*), CLISP, the KCL family(*). (Don't
>> know about Lucid or Corman; nor InterLisp, Spice Lisp, or the other pre-CL implementations.)
>>
>> (*) I am reasonably certain of these. OpenMCL 1.1 and a recent ECL both do, by experiment.
>>
>> AFAIK it was CMUCL that broke from this practice; and AFAIK it is only the CMUCL family that declares the variable globally
>> special, or indeed does anything other than just set the symbol-value.
> CMUCL indeed does declare it special, but not SBCL.
> (progn (setq fooo 10) (sb-cltl2:variable-information 'fooo))
> => NIL, NIL, NIL
There you go for a portable, standard-conformant solution to your problem.
(defpackage lexicals)
(defmacro deflexical (name &optional value doc)
(let ((special (intern (format nil "~W" name) :lexicals)))
`(progn
(defvar ,special ,@(when value `(,value)) ,@(when doc `(,doc)))
(define-symbol-macro ,name ,special))))
Should probably be added to alexandria or some such.
(Thanks to Nikodemus or whoever suggested that idea, long ago.)
[ François-René ÐVB Rideau | Reflection&Cybernethics | http://fare.tunes.org ]
Backwards compatible -- If it's not backwards it's not compatible
-- Greg Newton <gregnewton at netscape.net>
More information about the alexandria-devel
mailing list