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/

10-12 15:45