通常、関数を最初に作成する際に名前を付けます。これを関数の定義と呼び、一般的にはdefunマクロを用いて行います。本節では、関数を定義するその他の方法についても説明します。
defun は、Lisp の新しい関数を定義する際の一般的な方法です。これにより、シンボル name が、引数リスト args(引数リストの特徴 を参照)と、body
で与えられるボディ形式を持つ関数として定義されます。name と args のいずれもクォートしてはいけません。
doc(存在する場合)は、関数のドキュメント文字列を指定する文字列である必要があります(関数のドキュメント文字列を参照)。declare(存在する場合)は、関数のメタデータを指定するdeclare形式である必要があります(declare形式を参照)。interactive(存在する場合)は、関数を対話的に呼び出す方法を指定するinteractive形式である必要があります(対話的呼び出しを参照)。
defun の戻り値は未定義です。
以下にいくつか例を挙げます。
(defun foo () 5)
(foo)
⇒ 5
(defun bar (a &optional b &rest c)
(list a b c))
(bar 1 2 3 4 5)
⇒ (1 2 (3 4 5))
(bar 1)
⇒ (1 nil nil)
(bar) error→ Wrong number of arguments.
(defun capitalize-backwards () "Upcase the last letter of the word at point." (interactive) (backward-word 1) (forward-word 1) (backward-char 1) (capitalize-word 1))
ほとんどのEmacs関数はLispプログラムのソースコードの一部であり、Emacs
Lispリーダーがプログラムを実行する前にソースコードを読み込む際に定義されます。ただし、プログラムのコード実行時にdefun呼び出しを生成するなど、実行時に動的に関数を定義することも可能です。その場合は、*Help*バッファに関数の定義へジャンプするためのボタンを表示するC-h
fなどのEmacsのヘルプコマンドが、ソースコードを特定できない可能性があることに注意してください。動的に関数を生成する場合、通常のdefunへの静的な呼び出しとは見た目が大きく異なるためです。definition-nameまたはfind-function-type-alistプロパティを使用することで、こうした関数を生成するコードの特定を容易にできます。詳細は標準シンボルプロパティを参照してください。
既存の関数を意図せず再定義しないよう注意してください。defun は、car のようなプリミティブ関数であっても、躊躇や通知なく再定義してしまいます。Emacs
がこれを禁止しないのは、関数の再定義が意図的に行われる場合もあり、意図的な再定義と意図しない再定義を区別する方法がないためです。
この関数は、シンボル name を、定義 definition を持つ関数として定義します。definition
には、任意の有効な Lisp 関数やマクロ、特殊形式(特殊形式 を参照)、キーマップ(キーマップ を参照)、あるいはベクトルや文字列(キーボードマクロ)が指定可能です。defalias の戻り値は 未定義 です。
doc が nil 以外の場合、name の関数ドキュメントになります。そうでない場合は、definition で提供されているドキュメントが使用されます。
内部的には、defalias は通常 fset
を用いて定義を設定します。ただし、name に defalias-fset-function プロパティがある場合は、対応する値が fset の代わりに呼び出す関数として使用されます。
defalias
を使用する適切な場面は、特定の関数やマクロ名が定義される箇所—特に、ロード対象のソースファイル内でその名前が明示的に記述されている箇所です。これは、defalias が defun
と同様に、どのファイルでその関数が定義されたかを記録するためです(アンローディング を参照)。
これに対し、他の目的で関数定義を操作するプログラムでは、そのような記録を保持しないfsetを使用するのが適切です。関数セルの内容へのアクセスを参照してください。
結果として得られる関数定義の連鎖が循環する場合、Emacsはcyclic-function-indirectionエラーを通知します。
object
が関数エイリアスであるかどうかを判定します。エイリアスである場合は、関数エイリアスチェーンを表すシンボルのリストを返し、そうでない場合は nil を返します。例えば、a が b のエイリアスであり、b が c のエイリアスである場合:
(function-alias-p 'a)
⇒ (b c)
また、現在は廃止されており効果のない、2つ目のオプション引数もあります。
defun や defalias
を使って新しいプリミティブ関数を作成することはできませんが、これらを用いて、本来の定義がプリミティブである car や x-popup-menu
のようなシンボルであっても、その関数定義を変更することができます。ただし、これにはリスクが伴います。例えば、Lisp を完全に破壊することなく
car を再定義することはほぼ不可能です。x-popup-menu
のようなあまり使われない関数を再定義するのはそれほど危険ではありませんが、それでも期待通りに動作しない可能性があります。C
コードからプリミティブ関数が呼び出されている場合、それらはプリミティブの C 定義を直接呼び出すため、シンボルの定義を変更しても影響はありません。
defunのような関数を定義し、Lispコンパイラにインライン展開を行うよう指示するdefsubstも参照してください。インライン関数を参照してください。
関数名の定義を解除するには、fmakunbound を使用します。関数セルの内容へのアクセスを参照してください。