13.10 闭包

正如 Scoping 变量绑定的作用域规则 中所说明的,Emacs 可以选择性地启用变量的词法绑定。当开启词法绑定时,你创建的任何命名函数(例如通过 defun),以及通过 lambda 宏、function 特殊形式或 #' 语法创建的任意匿名函数(see 匿名函数),都会被自动转换成一个 闭包(closure)

闭包是一种携带了其定义时所处词法环境记录的函数。当它被调用时,其定义内部对词法变量的所有引用,都会使用这份被保留下来的词法环境。在其他所有方面,闭包的行为都与普通函数非常相似;特别地,它们可以用与普通函数完全相同的方式被调用。

关于闭包的使用示例,see 词法绑定

目前,一个 Emacs Lisp 闭包对象以列表形式表示:符号 closure 作为第一个元素,表示词法环境的列表作为第二个元素,剩下的元素则是参数列表与函数体形式:

;; lexical binding is enabled.
(lambda (x) (* x x))
     ⇒ #f(lambda (x) [t] (* x x))

但是,闭包的内部结构对 Lisp 环境暴露这一事实,仅被视为内部实现细节。因此,我们不建议直接查看或修改闭包对象的结构。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike