シンボルの関数定義とは、そのシンボルの関数セルに格納されているオブジェクトのことです。ここで説明する関数は、シンボルの関数セルへのアクセス、判定、および設定を行います。
関数 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とは異なる点に注意してください。voidをdefunで定義すれば、有効な関数となり得ます。
シンボルの関数定義が void であるかどうかは、fboundp
で確認できます。シンボルに関数定義を与えた後、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 のように関数を定義または変更する構文において、サブルーチンとして利用することです(Advising Emacs Lisp
Functions を参照)。また、シンボルに対して、関数ではない関数定義(例えばキーボードマクロなど)を付与するためにも使用できます(Keyboard Macros を参照):
;; Define a named keyboard macro.
(fset 'kill-two-lines "\^u2\^k")
⇒ "\^u2\^k"
fset を使用して関数の別名を指定したい場合は、代わりに defalias の使用を検討してください。defalias の定義
を参照してください。
結果として得られる関数定義の連鎖が循環する場合、Emacsはcyclic-function-indirectionエラーを通知します。