[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