proclaim3つの記号の違いを説明していただけますdeclaimかdeclare?
1 に答える
proclaimグローバル宣言を行うための関数に名前を付けます。可能な限り、代わりに使用する必要があります。declaimdeclareは、一部のフォームの先頭でローカル宣言を行うための単なるシンボル(つまり、関数、マクロ、または特殊演算子の名前ではありません)です(これらのフォームの構文の要素として表示できます)。
したがって、最初の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次に、マクロでより単純でより便利です。