[imp-hackers] locally special and symbol macros
Tobias C. Rittweiler
tcr at freebits.de
Mon Oct 19 11:01:14 UTC 2009
[ I just sent the following posting to the OpenMCL development mailing
list. But it's also very apropos here. ]
I think the following
(let ((x :special))
(declare (special x))
(symbol-macrolet ((x :symbol-macro))
(values x (locally (declare (special x)) x))))
should return
:SYMBOL-MACRO, :SPECIAL
It currently returns
:SYMBOL-MACRO, :SYMBOL-MACRO
SBCL and CLISP return :SYMBOL-MACRO, :SPECIAL, while others signal an
error. I think, signalling an error is a mistake, and I'll mention this
issue to those implementations.
The reasoning why I think :SYMBOL-MACRO, :SPECIAL is the correct
implementation (and erroring is not) is mostly because
http://www.lispworks.com/documentation/HyperSpec/Issues/iss228_w.htm
says so. I couldn't find it spelled out as explicitly in the spec
itself. Perhaps you're more lucky than me.
There's some inconsistency at place here, though, because
the definition of DEFINE-SYMBOL-MACRO explicitly forbids declaring a
global symbol macro to be special.
So the following _should_ signal an error:
(progn (define-symbol-macro .foo. :global-symbol-macro)
(locally (declare (special .foo.)) .foo.))
(CCL returns :GLOBAL-SYMBOL-MACRO)
or
(progn (define-symbol-macro .foo. :global-symbol-macro)
(proclaim '(special .foo.)))
On the other hand,
(progn (define-symbol-macro .foo. :global-symbol-macro)
(let ((.foo. :special))
(declare (special .foo.))
(values .foo.
(let ((.foo. :lexical))
(locally (declare (special .foo.)))))))
should _not_ signal an error, but return :SPECIAL, :SPECIAL.
-T.
More information about the implementation-hackers
mailing list