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 は文句を言わず、実際、上記のマクロは期待どおりに正確に動作するようです。何を与える?