13.9 访问函数单元内容

符号的 函数定义(function definition) 是存储在该符号函数单元(function cell)中的对象。本节描述的函数用于访问、检测和设置符号的函数单元。

另请参见函数 indirect-function。See Definition of indirect-function

Function: symbol-function symbol

返回 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:只要您通过 defunvoid定义函数体,它就可以成为一个有效的函数。

您可以使用 fboundp 函数检测符号的函数定义是否为空。当您为符号定义函数后,若想再次将其置为空函数,可调用 fmakunbound 函数。

Function: fboundp symbol

该函数的作用是:如果符号的函数单元中存储的是非 nil 对象,则返回 t;否则返回 nil。此函数不会检查该对象是否为合法的函数。

Function: fmakunbound symbol

该函数会将 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
Function: fset symbol definition

该函数会将 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(函数间接引用循环)错误。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike