Next: バッファーローカル変数, Previous: 変数が変更されたときに実行される関数。, Up: 変数 [Contents][Index]
ある変数にたいするローカルバインディングを作成するとき、そのバインディングはプログラムの限られた一部だけに効果をもちます(ローカル変数を参照)。このセクションでは、これが正確には何を意味するかについて説明します。
ローカルバインディングはそれぞれ、個別にスコープ(scope: 範囲という意味)とエクステント(extent: これも範囲を意味する)をもちます。スコープはそのバインディングにアクセスできるのが、テキストのソースコードのどこ(where)であるかを示します。エクステントはプログラムの実行中に、そのバインディングが存在するのがいつ(when)であるかを示します。
歴史的な理由により、Emacs
Lispには2つの方言が存在しており、それらはバッファーローカル変数lexical-binding
を通して選択することができます。Emacs
Lispの現代的な方言においてはローカルのバインディングはデフォルトではレキシカルです。レキシカルバインディング(lexical
binding)はレキシカルスコープ(lexical
scope)をもち、これはその変数にたいするすべての参照が、バインディング構文内にテキスト的に配置されなければならないことを意味します11。レキシカルバインディングは不定エクステント(indefinite
extent)ももっています。これはある状況下において、クロージャ(closures)と呼ばれるスペシャルオブジェクトにより、バインディング構造が実行を終えた後でさえも、存続し続けることを意味します。レキシカルスコープは静的スコープ(static
scoping)ともよく呼ばれています。
ローカルバインディングをダイナミックにすることもできます。Emacs
Lispの古い方言では常にダイナミックバインディング、現代的な方言ではオプションでダイナミックにすることができます。ダイナミックバインディング(dynamic
binding)はダイナミックスコープ(dynamic
scope)をもち、それはプログラムの任意の範囲が、その変数バインディングにアクセスするかもしれないことを意味します。これはダイナミックエクステント(dynamic
extent)ももっています。これはそのバインディング構造(let
フォームのbodyなど)が実行される間だけ、そのバインディングが存続することを意味します。
ロードされるコードやLispファイルから評価されるコードに方言の宣言がない場合のデフォルトは、依然としてダイナミックのみの古いEmacs Lisp方言のままです。最終的には現代的な方言がデフォルトになるでしょう。将来において正しく動作し続けることを保証するために、すべてのLispファイルは使用する方言を宣言する必要があります。
以降のサブセクションではレキシカルバインディングとダイナミックバインディング、およびEmacs Lispプログラムでレキシカルバインディングを有効にする方法についてより詳細に説明します。