Symbol DECLARE
declare declaration-specifier*
declaration-specifier - 宣言指定子。評価されません。
declareの式は、よく宣言と呼ばれ、 特定のフォームのボディ部の開始の部分にのみ記載することができます。 この文脈が許されるのであれば、フォームの先行した位置にのみ declareかドキュメント文字が許されます。
declare式は、ラムダ式か、 下記の表のリストで示すフォームに記載することができます。
Figure 3-23. 宣言を配置できる標準フォーム
declare式は、これらのフォームの構文によって 指定できる場所のみに配置できます。 declare式を評価しようとした結果は未定義です。 そのような式が現れた場合は、それらの出現は暗黙的にチェックされ、 そして実際には評価されません。 これが「declareフォーム」ではなく 「declare式」と呼んでいる理由です。
マクロフォームは宣言を展開できません。 declare式は、フォームが参照している 実際のサブフォームとして現れなければなりません。
次の表は、declareで使用できる宣言識別子です。
dynamic-extent |
ignore |
optimize |
ftype |
inline |
special |
ignorable |
notinline |
type |
Figure 3-24. ローカル宣言指定子
実装はその他の(実装定義の)宣言識別子を自由にサポートできます。
(defun nonsense (k x z)
(foo z x) ;最初のfooの呼び出し
(let ((j (foo k x)) ;2回目のfooの呼び出し
(x (* k k)))
(declare (inline foo) (special x z))
(foo x j z))) ;3回目のfooの呼び出しこの例では、inline宣言は3回目のfooの呼び出しのみに適用され、 最初と2番目には適用されません。 letにあるxのspecial宣言はxを動的束縛にして、 letのボディ部にあるxの参照を動的参照にします。 2番目のfooの呼び出しで参照しているxは、 nonsenceの2番目のパラメーターにあるローカル参照です。 最初のfooの呼び出しで参照しているxは、 ローカル参照でありspecialではありません。 zのspecial宣言は、3番目のfooの呼び出しのzを動的参照にします。 これはnonsenceのzというパラメーターを示していません。 なぜならspecial宣言のパラメーター束縛の中には存在していないからです。 (zのspecial宣言はdefunのボディ部には現れていませんが、 その内側のフォームには存在してます。 つまりパラメーターの束縛には影響してないと言うことです。)
なし。
declare式をフォームとして評価しようとしたときの結果は未定義です。
proclaim, 4.2.3. 型指定子, declaration, dynamic-extent, ftype, ignorable, ignore, inline, notinline, optimize, type
なし。