27

proclaim3つの記号の違いを説明していただけますdeclaimdeclare

4

1 に答える 1

35

それらは記号であり、キーワードではありません。

  1. proclaimグローバル宣言を行うための関数に名前を付けます。可能な限り、代わりに使用する必要があります。 declaim

  2. declaimコンパイル時にも有効なグローバル宣言(など)を作成するためのマクロに名前を付けます。 proclaim

  3. declareは、一部のフォームの先頭でローカル宣言を行うための単なるシンボル(つまり、関数マクロ、または特殊演算子の名前ではありません)です(これらのフォームの構文の要素として表示できます)。

したがって、最初の2つは地球環境に影響を与え、最後の1つはローカルです。

declaimコンパイル環境proclaimですぐに効果があるため、よりも望ましいです。

フォームの実行にはproclaimコンパイルに影響を与える可能性のある影響がありますが、コンパイラーは宣言フォームを認識して特別に処理しようとはしません。次のような宣言は、たとえトップレベルのフォームであっても、実行されるまで効果がありません。

(proclaim '(special *x*))

コンパイル時の副作用が必要な場合 eval-whenは、便利な場合があります。例えば:

(eval-when (:execute :compile-toplevel :load-toplevel) (proclaim '(special *x*)))

ただし、このような場合のほとんどは、 declaimこの目的で使用することをお勧めします。

つまり、コードが

(proclaim '(special *x*))
(defun foo () (print *x*))

fooコンパイラは、未知の特殊変数を読み取ると文句を言います*x*が、

(declaim (special *x*))
(defun foo () (print *x*))

警告は発生しません。

PS。CLがなぜ持っているのか疑問に思っているならproclaim:最初に、歴史的にそれは以前declaimにありました、そしてproclaim次に、マクロでより単純でより便利です。

于 2013-02-11T16:12:57.733 に答える