使用 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*
的值需要在读取时已知才能使这项工作正常进行。
最近用了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*
的值需要在读取时已知才能使这项工作正常进行。