declare Form ¶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 に従ってインデントします。通常はマクロに使用されますが、関数でも有効です。マクロのインデント を参照してください。
(autoload-macro value) ¶これはマクロを定義する際に使用されます。value が ‘expand’
である場合、オートロードコメントに続くマクロの呼び出しは、オートロードの生成時にまず展開されます。この宣言は、loaddefs-generate--make-autoload
で展開するマクロのリストをハードコードする代わりの手段として使用されます。オートロードを参照してください。
(interactive-only value)関数の interactive-only プロパティを value に設定します。インタラクティブ専用プロパティを参照してください。
(obsolete current-name when) ¶make-obsolete の呼び出しと同様に、関数またはマクロを廃止済みとしてマークします(関数の廃止宣言を参照)。current-name
には、シンボル(この場合、警告メッセージでは代わりにそのシンボルを使用するよう指示されます)、文字列(警告メッセージを指定)、または nil(この場合、警告メッセージに詳細な情報は含まれません)を指定します。when には、関数またはマクロが最初に廃止された時期を示す文字列を指定します。
(compiler-macro
expander) ¶これは関数に対してのみ使用でき、コンパイラに expander
を最適化関数として使用するよう指示します。(function
args…)
という形式の関数呼び出しに遭遇すると、マクロ展開器はその形式に加えて expander、args… を呼び出します。また、expander
は、関数呼び出しの代わりに使用する新しい式を返すか、あるいは関数呼び出しをそのままにするよう示すために形式をそのまま返すことができます。
expander がラムダ形式である場合は、単一の引数で記述する必要があります(すなわち、(lambda (arg) body) の形式になります)。これは、関数の仮引数がラムダの引数リストに自動的に追加されるためです。
(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 に渡されます。
(completion completion-predicate)completion-predicate を関数として宣言し、M-x で補完を求める際に、関数のシンボルを関数リストに含めるかどうかを判定します。この述語関数は、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 プロパティと同じです(標準シンボルプロパティを参照)。
(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からネイティブコードへのコンパイルを参照)によるコード生成の最適化および型推論に使用されます。型宣言が不適切だと、ネイティブコンパイルされたコードでクラッシュが発生する可能性があります(後述)。型宣言がある関数は、C-h C-f によって宣言された型を持つものとして表示されます。これに対し、型宣言がない関数は推論された型を持つものとして表示されます。
type は、(function (arg-1-type … arg-n-type) RETURN-TYPE) 形式の型指定子(型指定子を参照)です。引数の型は、関数の呼び出し規約を反映させるため、&optional や &rest
と混在させることができます(引数リストの特徴を参照)。
function 存在する場合は、定義される関数名とする必要があります。
以下は、declare 内で ftype
を使用して、number 型の引数を受け取り boolean
を返す関数 positive-p を定義する例です:
(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
がクラッシュしたりすることがあります。型宣言された関数を再定義またはアドバイズする際は、これらの問題を回避するため、元のシグネチャを維持する必要があります。
no-font-lock-keywordこれはマクロにのみ適用されます。この宣言を持つマクロは、font-lock(Font Lock Modeを参照)によって、マクロとして特別に扱われるのではなく、通常の関数としてハイライトされます。
font-lock-keywordこの宣言を持つ通常の関数は、マクロと同様に font-lock(Font Lock Mode を参照)によってハイライトされます。