シンボルの関数定義(function definition)とは、そのシンボルの関数セルに格納されたオブジェクトのことです。ここではシンボルの関数セルへのアクセスやテスト、それをセットする関数を説明します。
Definition of indirect-functionの関数indirect-functionも参照してください。
これはsymbolの関数セル内のオブジェクトをリターンする。これはリターンされたオブジェクトが本物の関数であるかチェックしない。関数がvoidならリターン値はnil。
(defun bar (n) (+ n 2))
(symbol-function 'bar)
⇒ #f(lambda (n) [t] (+ n 2))
(fset 'baz 'bar)
⇒ bar
(symbol-function 'baz)
⇒ bar
シンボルに何の関数定義も与えていなければ、そのシンボルの関数セルはデフォルト値のnilとなり、そのような関数をvoidと呼んでいます。このシンボルを関数として呼びだそうとすると、Emacsはvoid-functionエラーをシグナルします。
変数のvoid(変数がvoidのときを参照)とは異なり、nilを含んだ関数セルをもつシンボルと、voidの関数は区別できません。voidはシンボルvoidと同じではありません。defunで定義すればvoidも有効な関数足り得るからです。
fboundpを使用して任意のシンボルの関数定義がvoidかどうかテストすることができます。シンボルに関数定義を与えた後は、fmakunboundを使用して再びvoidにすることができます。
この関数はそのシンボルが関数セルに非nilのオブジェクトをもっていればt、それ以外はnilをリターンする。これはそのオブジェクトが本物の関数であるかチェックしない。
この関数はsymbolの関数セルをnilにする。そのためこれ以降に関数セルへのアクセスを試みると、void-functionエラーが発生する。これはsymbolをリターンします(変数がvoidのときのmakunboundも参照)。
(defun foo (x) x)
(foo 1)
⇒1
(fmakunbound 'foo)
⇒ foo
(foo 1) error→ Symbol's function definition is void: foo
この関数はsymbolの関数セルにdefinitionを格納する。結果はdefinition。definitionは通常は関数か関数の名前であるべきだが、これはチェックされない。引数symbolは通常のどおり評価される引数である。
この関数は主に関数を定義したり変更して構築を行う、defunやadvice-addのようなものからサブルーチンとして使用される。たとえばキーボードマクロ(キーボードマクロを参照)のような、関数ではない関数定義をシンボルに与えるためにも使用することができる:
;; 名前つきのキーボードマクロを定義する。
(fset 'kill-two-lines "\^u2\^k")
⇒ "\^u2\^k"
関数にたいして別の名前を作成するためにfsetを使いたいなら、かわりにdefaliasの使用を考慮すること。Definition of defaliasを参照。
結果として得られた関数定義のチェーンが循環している場合には、Emacsはcyclic-function-indirectionエラーをシグナルする。