我刚刚阅读了关于#:阅读宏的内容,听起来它和gensym有非常相似的作用。
#::"引入一个未注册的符号"
gensym:"创建并返回一个新的、未注册的符号"
因此,进行一个简单的测试:
CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {1002FF77D3}>.
CL-USER> (defparameter #:dave 1)
#:DAVE
CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {100324B493}>.
很好,这样做是失败的,正如应该的那样。
现在进行宏测试。
(defmacro test (x)
(let ((blah '#:jim))
`(let ((,blah ,x))
(print ,blah))))
CL-USER> (test 10)
10
10
CL-USER>
这个东西很甜,可以像gensym一样使用。
对我来说,这看起来比gensym更清洁,结果似乎相同。我确定我错过了一个重要的细节,所以我的问题是,它是什么?