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の呼び出し
(foo z x) let ((j (foo k x)) ;2回目のfooの呼び出し
(* k k)))
(x (declare (inline foo) (special x z))
(;3回目のfooの呼び出し (foo x j z)))
この例では、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
なし。