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