宏扩展可以包含(声明 ..) 表达式吗?



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*)
  ...)

最新更新