proclaim
3つの記号の違いを説明していただけますdeclaim
かdeclare
?
1 に答える
proclaim
グローバル宣言を行うための関数に名前を付けます。可能な限り、代わりに使用する必要があります。declaim
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
次に、マクロでより単純でより便利です。