使用Sharpsign Dot有什么好处?

ccQ*_*ein 5 lisp common-lisp reader

我最近使用过cl-ppcre软件包,我对它们如何优化此软件包感到非常好奇,因为我想学习优化常见的Lisp。我注意到他们在声明表达式中经常使用Sharpsign Dot,就像这里。优化设置在此处

他们为什么这样写?有什么好处吗?还是有一些规则要做?

更新:我跑步

(defvar *b* '(optimize speed))
(pprint (macroexpand-1 '(declaim *b*)))
(pprint (macroexpand-1 '(declaim #.*b*))) ;; => this one is right
Run Code Online (Sandbox Code Playgroud)

那么,#.在宏调用之前,eval值会否?像它一样先评估该值,然后将其替换为宏参数。

Syl*_*ter 8

Sharpsign Dot将在读取时评估下一个表达式。因此,它将作为读者获取结果的手段,而CL的其他级别则不知道这一点。由于存在评估规则,不能使依赖于文字的宏变为动态的,因此读时间宏将绕过该宏,并使其成为动态表达式,而对于其他级别的读者而言,其文字则是文字。

好处是可以提高元编程水平。

  • 将此答案与原始问题联系起来: [`declaim`](http://clhs.lisp.se/Body/m_declai.htm#declaim) 是一个宏,它采用“声明说明符”作为参数;**未评估* *。” (2认同)

Rai*_*wig 5

看到不同:

CL-USER 7 > (defvar *answer* 42)
*ANSWER*

CL-USER 8 > '(*answer* #.*answer*)
(*ANSWER* 42)
Run Code Online (Sandbox Code Playgroud)

#.允许在读取时评估表达式。结果将从读取器返回 - 而不是原始表达式。

CL-USER 9 > '(*answer* (* #.*answer* pi) #.(* pi *answer*))
(*ANSWER* (* 42 PI) 131.94689145077132D0)
Run Code Online (Sandbox Code Playgroud)

请注意,*answer*需要在读取时知道的值才能进行此操作。