动态绑定是一项强大的特性,因为它允许程序引用不在自身局部文本作用域内定义的变量。但是,如果不加节制地使用,也会让程序难以理解。
首先,要谨慎选择变量名,避免命名冲突(see Emacs Lisp Coding Conventions)。
defvar 表达式将其声明为特殊变量,并且永远只在它已被绑定时才对其赋值。这样一来,任何在未绑定时引用该变量的操作都会触发 void-variable 错误。
defvar、defconst(see 定义全局变量)或 defcustom(see 定义自定义变量)来定义变量。通常,定义应放在 Emacs Lisp 文件的顶层。定义中应尽可能包含文档字符串,说明变量的含义与用途。
这样你就可以在程序的任意位置对该变量进行绑定,并且能确切预知绑定的效果。无论在何处遇到该变量,都可以很方便地回溯到它的定义,例如通过 C-h v 命令(前提是变量定义已被加载到 Emacs 中)。See Name Help in The GNU Emacs Manual。
例如,对于像 case-fold-search 这类可自定义变量,使用局部绑定是很常见的做法:
(defun search-for-abc ()
"Search for the string \"abc\", ignoring case differences."
(let ((case-fold-search t))
(re-search-forward "abc")))