% Symbol DECLARE
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
なし。