シンボルの関数定義(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
エラーをシグナルする。