Common Lisp Hyperspec指出“宏形式不能扩展成声明;声明表达式必须作为它们所引用的形式的实际子表达式出现。”
我对“扩展为”的含义感到困惑。如下所示的宏由于明显的原因而无法工作:
(defmacro optimize-fully ()
`(declare (optimize (speed 3) (safety 0))))
但是,如果宏扩展仅包含
(declare ...)
表达式怎么办?(defmacro defun-optimized (name (&rest lambda-list) &rest body)
`(defun ,name ,lambda-list
(declare (optimize (speed 3) (safety 0)))
,@body))
(defun-optimized foobar (a b)
(* a b))
这是否违反规范?我使用的CL实现SBCL并没有提示,实际上,上面的宏似乎完全按照预期的方式工作。是什么赋予了?
最佳答案
您的第一个示例正是它所禁止的。您不能将像这样的代码与类似这样的东西结合在一起:
(defun optimized (a b)
(optimize-fully)
(+ a b))
我有时会看到这样的代码:
(defvar *optimization-settings* '(optimize (speed 3) (safety 0)))
(defun foo (a b)
(declare #.*optimization-settings*)
...)
关于macros - 宏扩展可以包含(声明…)表达式吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18645299/