6

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

4

1 回答 1

15

你的第一个例子正是它所禁止的。你不能将这样的代码与这样的代码结合起来:

(defun optimized (a b)
  (optimize-fully)
  (+ a b))

不过,我有时会看到这样的代码:

(defvar *optimization-settings* '(optimize (speed 3) (safety 0)))

(defun foo (a b)
  (declare #.*optimization-settings*)
  ...)
于 2013-09-05T20:41:21.793 回答