declareフォーム ¶declare(宣言)は特別なマクロで、関数やマクロにメタプロパティを追加するために使用できます。たとえば陳腐化しているとマークしたり、Emacs
Lispモード内の特別なTABインデント規約を与えることができます。
このマクロは引数を無視してnilとして評価されるので、実行時の効果はない。しかしdefunやdefsubst(関数の定義を参照)、またはdefmacroマクロ(マクロの定義を参照)の定義のdeclare引数にdeclareフォームがある場合は、specsで指定されたプロパティを関数またはマクロに追加します。これはdefun、defsubst、defmacroにより特別に処理される。
specs内の各要素は(property
args…)というフォームをもつこと。またそれらをクォートしないこと。これらは以下の効果をもつ:
(advertised-calling-convention signature when) ¶これはset-advertised-calling-convention(関数の陳腐化の宣言を参照)の呼び出しと同じように振る舞う。signatureにはその関数(またはマクロ)にたいする正しい引数リスト、whenには古い引数リストが最初に陳腐化する時期を示す文字列を指定する。
(debug edebug-form-spec)これはマクロだけに有効である。Edebugでそのマクロ入ったときに、edebug-form-specを使用する。マクロ呼び出しのインストルメントを参照のこと。
(doc-string n)自身が関数やマクロ、変数のようなエンティティーを定義するために使用されるような関数やマクロを定義するときにこれが使用される。これはn番目の引数というこを示し、もしそれがあれば、それはドキュメント文字列とみなされる。
(indent indent-spec)この関数(かマクロ)にたいするインデント呼び出しは、indent-specにしたがう。これは関数でも機能するが、通常はマクロで使用される。マクロのインデントを参照のこと。
(interactive-only value)その関数のinteractive-onlyプロパティにvalueをセットする。The interactive-only propertyを参照のこと。
(obsolete current-name when) ¶make-obsolete(関数の陳腐化の宣言を参照)と同様に、関数(かマクロ)が陳腐化しているとマークする。current-nameにはシンボル(かわりにこのシンボルを使うことを促す警告メッセージになる)、文字列(警告メッセージを指定)、またはnil(警告メッセージには追加の詳細が含まれない)を指定すること。whenにはその関数(かマクロ)が最初に陳腐化する時期を示す文字列を指定すること。
(compiler-macro expander) ¶これは関数だけに使用でき、最適化関数(optimization
function)としてexpanderを使用するようコンパイラーに告げる。(function
args…)のようなその関数への呼び出しフォームに出会うと、マクロ展開機能(macro
expander)はargs…と同様のフォームでexpanderを呼び出す。expanderはその関数呼び出しのかわりに使用するための新しい式、または変更されていないフォーム(その関数呼び出しを変更しないことを示す)のどちらかをリターンすることができる。
expanderがlambdaフォームなら、((lambda (arg)
body)のように)単一の引数をもつフォームとして記述すること。関数の正規引数はlambdaの引数リストに自動的に追加されるため。
(gv-expander expander)expanderがgv-define-expanderと同様、ジェネリック変数としてマクロ(か関数)にたいする呼び出しを処理する関数であることを宣言する。expanderはシンボルかフォーム(lambda
(arg) body)を指定できる。フォームなら、その関数は追加でそのマクロ(か関数)の引数にアクセスできる。
(gv-setter setter)setterがジェネリック変数としてマクロ(か関数)にたいする呼び出しを処理する関数であることを宣言する。setterはシンボルかフォームを指定できる。シンボルなら、そのシンボルはgv-define-simple-setterに渡される。フォームなら(lambda
(arg)
body)という形式で、その関数は追加でマクロ(か関数)の引数にアクセスでき、それはgv-define-setterに渡される。
extraM-xでの補完にたいして入力を求める際に、関数のシンボルを関数リストに含めるかどうかを決定する関数としてcompletion-predicateを宣言する。この述語関数はread-extended-command-predicateがcommand-completion-default-include-pにカスタマイズされているときだけ呼び出される。read-extended-command-predicateのデフォルトの値はnil
(execute-extended-commandを参照)。述語completion-predicateは関数のシンボル、カレントバッファーという2つの引数で呼び出される。
(modes modes)指定されたmodesにのみ適用されることを意図したコマンドであることを指定する。
(interactive-args arg ...)repeat-command用に格納されるべき引数を指定する。argはそれぞれargument-name
formという形式。
(pure val)valが非nilなら、その関数は純粋(pure)である(関数とは?を参照)。これは関数のシンボルのpureプロパティと同じ(シンボルの標準的なプロパティを参照)。
(side-effect-free val)valが非nilならこの関数には副作用がないので、関数の値を無視するような呼び出しをバイトコンパイラーは無視できる。これは関数のシンボルのside-effect-freeプロパティと同じ。シンボルの標準的なプロパティを参照のこと。
(important-return-value val)valが非nilならバイトコンパイラーはこの関数呼び出しがリターン値を使用しないことについて警告を発する。これは関数のシンボルのimportant-return-valueプロパティと同じである。シンボルの標準的なプロパティを参照のこと。
(speed n)この関数のネイティブコンパイルにたいして有効なnative-comp-speedの値を指定する(ネイティブコンパイル変数を参照)。これによりその関数に発行されるネイティブコードに用いる最適化レベルを関数レベルで制御できるようになる。特にnが−1の場合には、その関数のネイティブコンパイルによってその関数にたいするネイティブコードではなくバイトコードが発行される。
(safety n)この関数に有効なcompilation-safetyの値を指定する。これにより、その関数に発行されるコードにたいする安全レベルを、関数のレベルで制御できるようになる(ネイティブコンパイル変数を参照)。
(ftype type &optional function) ¶この関数のタイプをtypeと宣言する。describe-functionによるドキュメント化で使用。コード生成の改善やタイプ宣言なしで他の関数のタイプをより正確に取得するためにネイティブコンパイラー(Lispからネイティブコードへのコンパイルを参照)によって使用されることもあり得る。
type is a type specifier (see Type Specifiers) in the form
(function (arg-1-type … arg-n-type) RETURN-TYPE). Argument types can be interleaved with symbols
&optional and &rest to match the function’s arguments
(see 引数リストの機能).
functionが与えられる場合には、定義される関数の名前であること。
以下はタイプnumberの引数を受け取りbooleanをリターンする関数positive-pを宣言するdeclareの内部にftypeを使用する例:
(defun positive-p (x)
(declare (ftype (function (number) boolean)))
(when (> x 0)
t))
同様に、以下は1つ目の引数がconsかnumber、2つ目がタイプstringのオプション引数でis-consあis-numberいずれかのシンボルをリターンする関数cons-or-numberを宣言する例:
(defun cons-or-number (x &optional err-msg)
(declare (ftype (function ((or cons number) &optional string)
(member is-cons is-number))))
(if (consp x)
'is-cons
(if (numberp x)
'is-number
(error (or err-msg "Unexpected input")))))
他のタイプについての説明についてはLispのデータ型)を参照のこと。
不正なタイプの関数を宣言することにより未定義の動作、期待しない結果、コードがネイティブコンパイルされたコードがロードされていて、それがcompilation-safetyレベル0でコンパイルされたコードならEmacsのクラッシュさえ引き起こしかねない(compilation-safetyを参照)。この種の未定義の動作を避けるためには、タイプ宣言された関数の再定義(またはアドバイス)においては元のシグネチャーにしたがって置換を行うことにも注意を要する。
no-font-lock-keywordこれはマクロにたいしてのみ有効。この宣言をもつマクロは特にマクロとしてではなく、通常の関数としてfont-lockによりハイライトされる(Font Lockモードを参照)。