シンボルの関数定義(function definition)とは、そのシンボルの関数セルに格納されたオブジェクトのことです。ここではシンボルの関数セルへのアクセスやテスト、それをセットする関数を説明します。
Definition of indirect-functionの関数indirect-function
も参照してください。
これはsymbolの関数セル内のオブジェクトをリターンする。これはリターンされたオブジェクトが本物のの関数であるかチェックしない。
関数セルがvoidならリターン値はnil
。関数セルがvoidのときとnil
がセットされているときを区別するにはfboundp
(以下参照)を使用する。
(defun bar (n) (+ n 2)) (symbol-function 'bar) ⇒ (lambda (n) (+ n 2))
(fset 'baz 'bar) ⇒ bar
(symbol-function 'baz) ⇒ bar
シンボルに何の関数定義も与えていなければ、そのシンボルの関数セルはvoidだと言います。言い換えると、その関数セルはどんなLispオブジェクトも保持しません。そのシンボルを関数として呼びだそうとすると、Emacsはvoid-function
エラーをシグナルします。
voidはnil
やシンボルvoid
とは異なることに注意してください。シンボルnil
とvoid
はLispオブジェクトであり、他のオブジェクトと同じように関数セルに格納することができます(これらのシンボルはdefun
を使用して有効な関数になることができる)。voidであるような関数セルは、どのようなオブジェクトも含んでいません。
fboundp
を使用して任意のシンボルの関数定義がvoidかどうかテストすることができます。シンボルに関数定義を与えた後は、fmakunbound
を使用して再びvoidにすることができます。
この関数はそのシンボルが関数セルにオブジェクトをもっていればt
、それ以外はnil
をリターンする。これはそのオブジェクトが本物の関数であるかチェックしない。
この関数はsymbolの関数セルをvoidにする。そのためこれ以降に関数セルへのアクセスを試みると、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を参照。