我最近用过cl-ppcre包,我很好奇他们如何优化这个包,因为我想学习优化常见的Lisp。我注意到他们在声明表达式中经常使用 Sharpsign 点,就像这里一样。优化设置在这里。
他们为什么这样写?有什么好处吗?还是某些规则让他们做?
更新: 我跑
(defvar *b* '(optimize speed))
(pprint (macroexpand-1 '(declaim *b*)))
(pprint (macroexpand-1 '(declaim #.*b*))) ;; => this one is right
那么,在宏观调用之前,评估值#.
?喜欢它首先评估值并在宏参数中替换它。
锐符号点将在读取时计算下一个表达式。因此,它将充当读者得到结果而其他级别的 CL 不知道这一点。由于计算规则的原因,依赖于文本的宏不能成为动态的,因此读取时间宏将绕过它,并使其成为动态表达式对读取器以外的其他级别的文本。
好处是元编程的额外级别。
查看区别:
CL-USER 7 > (defvar *answer* 42)
*ANSWER*
CL-USER 8 > '(*answer* #.*answer*)
(*ANSWER* 42)
#.
允许在读取时计算表达式。结果将从读取器返回 - 而不是原始表达式。
CL-USER 9 > '(*answer* (* #.*answer* pi) #.(* pi *answer*))
(*ANSWER* (* 42 PI) 131.94689145077132D0)
请注意,需要在读取时知道*answer*
的值才能完成此操作。