npt-japanese

% Symbol DECLARE

UP


Symbol DECLARE

Symbol DECLARE

構文

declare declaration-specifier*

引数

declaration-specifier - 宣言指定子。評価されません。

定義

declareの式は、よく宣言と呼ばれ、 特定のフォームのボディ部の開始の部分にのみ記載することができます。 この文脈が許されるのであれば、フォームの先行した位置にのみ declareかドキュメント文字が許されます。

declare式は、ラムダ式か、 下記の表のリストで示すフォームに記載することができます。

     
defgeneric do-external-symbols prog
define-compiler-macro do-symbols prog*
define-method-combination dolist restart-case
define-setf-expander dotimes symbol-macrolet
defmacro flet with-accessors
defmethod handler-case with-hash-table-iterator
defsetf labels with-input-from-string
deftype let with-open-file
defun let* with-open-stream
destructuring-bind locally with-output-to-string
do macrolet with-package-iterator
do* multiple-value-bind with-slots
do-all-symbols pprint-logical-block  

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にあるxspecial宣言はxを動的束縛にして、 letのボディ部にあるxの参照を動的参照にします。 2番目のfooの呼び出しで参照しているxは、 nonsenceの2番目のパラメーターにあるローカル参照です。 最初のfooの呼び出しで参照しているxは、 ローカル参照でありspecialではありません。 zspecial宣言は、3番目のfooの呼び出しのzを動的参照にします。 これはnonsencezというパラメーターを示していません。 なぜならspecial宣言のパラメーター束縛の中には存在していないからです。 (zspecial宣言はdefunのボディ部には現れていませんが、 その内側のフォームには存在してます。 つまりパラメーターの束縛には影響してないと言うことです。)

影響

なし。

例外

declare式をフォームとして評価しようとしたときの結果は未定義です。

参考

proclaim, 4.2.3. 型指定子, declaration, dynamic-extent, ftype, ignorable, ignore, inline, notinline, optimize, type

備考

なし。


TOP, Github