2009年12月30日水曜日

うんにゃらマクロ

「うんにゃら」をマクロにしてみました。


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 件のコメント: