ダイナミックバインディングは、プログラムにたいしてテキスト的なローカルスコープ内で定義されていない変数を参照することを許容する、強力な機能です。しかし無制限に使用した場合には、プログラムの理解を困難にしてしまうこともあります。
まずは名前の衝突が起こらないように変数の名前を選択してください(Emacs Lispコーディング規約を参照)。
defvar
を用いて初期値なしで宣言して、すでにバインド済みの場合を除き決して値を割り当てないこと。この方法によりバインドされていないときにこの変数を参照しようとする試みはすべてvoid-variable
エラーとなる。
defvar
、defconst
(グローバル変数の定義を参照)、defcustom
(カスタマイゼーション変数の定義を参照)で変数を定義する。この定義は通常はEmacs
Lispファイル内のトップレベルであること。この定義には可能な限り変数の意味と目的を説明するドキュメント文字列を含めること。
そうすればプログラム内のどこか別の場所で、それが何に影響するか確信をもって変数をバインドすることができる。その変数にどこで出会っても、(たとえば変数の定義がEmacsにロードされていればC-h vコマンドを通じて)定義を参照するのが簡単になる。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")))