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 に答える