変数に対してローカルバインディングを作成すると、そのバインディングはプログラムの限られた範囲内でのみ有効になります(ローカル変数を参照)。本節では、これが具体的に何を意味するのかについて説明します。
各ローカルバインディングには、一定のスコープと有効範囲があります。スコープとは、テキスト形式のソースコードのどこでそのバインディングにアクセスできるかを指します。有効範囲とは、プログラムの実行中にいつそのバインディングが存在するかを指します。
歴史的な経緯により、Emacs Lispには2つの方言が存在し、これらはlexical-bindingバッファローカル変数によって選択されます。現代のEmacs
Lisp方言では、ローカルバインディングはデフォルトでレキシカルです。レキシカルバインディングはレキシカルスコープを持ちます。つまり、その変数へのあらゆる参照は、テキスト上でバインディング構文内に位置していなければなりません13。また、不定の存続期間を持ちます。これは、クロージャと呼ばれるオブジェクトによって、状況によってはバインディング構文の実行が終了した後でもバインディングが存続し得ることを意味します。レキシカルスコープは、一般に静的スコープとも呼ばれます。
ローカルバインディングは動的であることもでき、旧来のEmacs Lisp方言では常に動的であり、現代の方言では任意で動的に設定できます。動的バインディングは動的スコープを持ち、プログラムのあらゆる箇所からその変数バインディングにアクセスできる可能性があります。また、動的範囲を持ち、バインディングはバインディング構文(letフォームの本体など)が実行されている間のみ有効となります。
方言宣言のないLispファイルからロードまたは評価されるコードでは、依然として旧来の動的専用Emacs Lisp方言がデフォルトとなっています。将来的には、モダンな方言がデフォルトとなる予定です。将来的にも正しく動作し続けるよう、すべてのLispファイルでは使用する方言を宣言する必要があります。
以下のサブセクションでは、字句束縛と動的束縛についてより詳しく解説するとともに、Emacs Lispプログラムで字句束縛を有効にする方法について説明します。