使用 Sharpsign Dot 有什么好处?

What's the benefit of using Sharpsign Dot?

最近用了cl-ppcre包,很好奇他们是怎么优化这个包的,因为我想学习优化common lisp。我注意到他们在声明表达式中经常使用 Sharpsign Dot,比如 here. The optimized setting is here

他们为什么这样写?有什么好处吗?或者某些规则必须这样做?

更新: 我运行

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

那么,#. 会在调用宏之前评估值吗?就像它首先评估值并在宏参数中替换它一样。

Sharpsign Dot 将在读取时计算下一个表达式。因此它将充当 reader 得到的结果,而其他级别的 CL 不知道这一点。由于评估规则,依赖文字的宏不能动态化,因此读取时间宏将绕过它并使其成为动态表达式,因为对于 reader.

以外的其他级别,动态表达式是文字的

好处是额外级别的元编程。

看区别:

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

CL-USER 8 > '(*answer* #.*answer*)
(*ANSWER* 42)

#. 允许在读取时计算表达式。结果将从 reader 返回,而不是原始表达式。

CL-USER 9 > '(*answer* (* #.*answer* pi) #.(* pi *answer*))
(*ANSWER* (* 42 PI) 131.94689145077132D0)

请注意,*answer* 的值需要在读取时已知才能使这项工作正常进行。