在加载 Emacs Lisp 文件或对 Lisp 缓冲区进行求值时,Lisp 方言由缓冲区局部变量 lexical-binding 决定。
如果这个缓冲区局部变量的值为非 nil,Emacs Lisp 文件和缓冲区将使用现代 Lisp 方言进行解析,该方言默认使用词法绑定而非动态绑定。如果为 nil,则使用旧方言,即对所有局部变量都采用动态绑定。
该变量通常作为文件局部变量为整个 Emacs Lisp 文件设置(see 文件局部变量)。注意:与其他此类变量不同,该变量必须写在文件的第一行。
在实际使用中,选择方言意味着 Emacs Lisp 文件的第一行通常形如:
;;; ... -*- lexical-binding: t -*-
for the modern lexical-binding dialect, and
;;; ... -*- lexical-binding: nil -*-
上述写法适用于仅支持动态绑定的旧方言。若未声明方言类型,默认会使用旧方言,但这一行为可能在未来版本中变更。如果未声明方言类型,编译器会发出警告。
当通过 eval 调用直接求值 Emacs Lisp 代码时,若传给 eval 的 lexical 参数为非 nil 值,则会启用词法绑定。See 求值。
词法绑定同样会在以下场景中启用:
Lisp Interaction 模式和 IELM 模式(分别用于 *scratch* 和 *ielm* 缓冲区);
通过 M-:(对应 eval-expression 函数)求值表达式时;
处理 Emacs 的 --eval 命令行选项(see Action Arguments in The GNU Emacs Manual)和 emacsclient 的 --eval 命令行选项时(see emacsclient Options in The GNU Emacs Manual)。