正如 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 环境暴露这一事实,仅被视为内部实现细节。因此,我们不建议直接查看或修改闭包对象的结构。