符号的 函数定义(function definition) 是存储在该符号函数单元(function cell)中的对象。本节描述的函数用于访问、检测和设置符号的函数单元。
另请参见函数 indirect-function。See Definition of 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(空函数)错误。
与空变量不同(see 变量为空的情况),符号的函数单元中存储 nil,和该函数处于 “空” 状态这两种情况是无法区分的。请注意,“空(void)”并非等同于符号 void:只要您通过 defun 为 void定义函数体,它就可以成为一个有效的函数。
您可以使用 fboundp 函数检测符号的函数定义是否为空。当您为符号定义函数后,若想再次将其置为空函数,可调用 fmakunbound 函数。
该函数的作用是:如果符号的函数单元中存储的是非 nil 对象,则返回 t;否则返回 nil。此函数不会检查该对象是否为合法的函数。
该函数会将 symbol 的函数单元设为 nil,后续若尝试访问该函数单元,会触发 void-function 错误。函数的返回值为 symbol。(另见 变量为空的情况 中介绍的 makunbound 函数。)
(defun foo (x) x)
(foo 1)
⇒1
(fmakunbound 'foo)
⇒ foo
(foo 1) error→ Symbol's function definition is void: foo
该函数会将 definition(定义内容)存入 symbol(符号)的函数单元中,返回值为 definition。通常情况下,definition 应当是一个函数或函数名,但该函数并不会对此做检查。参数 symbol 是一个普通的求值参数(即会先计算参数值再使用)。
此函数的主要用途是作为「定义或修改函数的语法结构」的底层子程序,例如 defun(定义函数)或 advice-add(see 为 Emacs Lisp 函数添加建议)。您也可以通过它为符号赋予「非函数类型」的函数定义,比如键盘宏(see Keyboard Macros):
;; Define a named keyboard macro.
(fset 'kill-two-lines "\^u2\^k")
⇒ "\^u2\^k"
如果您想通过 fset 为某个函数创建别名,建议改用 defalias 函数。See Definition of defalias。
若操作后形成的函数定义链出现循环引用,Emacs 会抛出 cyclic-function-indirection(函数间接引用循环)错误。