Next: , Previous: , Up: 関数   [Contents][Index]


13.9 関数セルの内容へのアクセス

シンボルの関数定義(function definition)とは、そのシンボルの関数セルに格納されたオブジェクトのことです。ここではシンボルの関数セルへのアクセスやテスト、それをセットする関数を説明します。

Definition of indirect-functionの関数indirect-functionも参照してください。

Function: symbol-function symbol

これは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とは異なることに注意してください。シンボルnilvoidはLispオブジェクトであり、他のオブジェクトと同じように関数セルに格納することができます(defunで定義すればvoidは有効な関数足り得る)。voidであるような関数セルは、どのようなオブジェクトも含んでいません。

fboundpを使用して任意のシンボルの関数定義がvoidかどうかテストすることができます。シンボルに関数定義を与えた後は、fmakunboundを使用して再びvoidにすることができます。

Function: fboundp symbol

この関数はそのシンボルが関数セルにオブジェクトをもっていればt、それ以外はnilをリターンする。これはそのオブジェクトが本物の関数であるかチェックしない。

Function: fmakunbound symbol

この関数は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
Function: fset symbol definition

この関数はsymbolの関数セルにdefinitionを格納する。結果はdefinitiondefinitionは通常は関数か関数の名前であるべきだが、これはチェックされない。引数symbolは通常のどおり評価される引数である。

この関数は主に関数を定義したり変更して構築を行う、defunadvice-addのようなものからサブルーチンとして使用される。たとえばキーボードマクロ(キーボードマクロを参照)のような、関数ではない関数定義をシンボルに与えるためにも使用することができる:

;; 名前つきのキーボードマクロを定義する。
(fset 'kill-two-lines "\^u2\^k")
     ⇒ "\^u2\^k"

関数にたいして別の名前を作成するためにfsetを使いたいなら、かわりにdefaliasの使用を考慮すること。Definition of defaliasを参照。