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,并没有抱怨,事实上,上面的宏似乎完全按预期工作。是什么赋予了?