CL-USER> (defmacro unnyara (name-string)
(let ((name-value (gensym))
(not-used (gensym)))
`(macrolet ((,name-value (,not-used)
(find-symbol (string-upcase ,name-string))))
(,name-value t))))
UNNYARA
CL-USER> (setq x 0)
0
CL-USER> (setq y 'a)
A
CL-USER> (proclaim '(special y))
T
CL-USER> (let ((x 1)
(y 'b))
(print (unnyara "x"))
(print (unnyara "y"))
(locally (declare (special x))
(print (unnyara "x")))
(progv '(x y) '(2 c)
(print (unnyara "x"))
(print (unnyara "y"))
(locally (declare (special x))
(print (unnyara "x"))
(values))))
1
B
0
1
C
2 ; No value
CL-USER>
レキシカルにしてもダイナミックにしても、適切な束縛の値を返してくれているようです。
こつこつ。
0 件のコメント:
コメントを投稿