12.10 変数のバインディングのスコーピングルール

ある変数にたいするローカルバインディングを作成するとき、そのバインディングはプログラムの限られた一部だけに効果をもちます(ローカル変数を参照)。このセクションでは、これが正確には何を意味するかについて説明します。

ローカルバインディングはそれぞれ、個別にスコープ(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プログラムでレキシカルバインディングを有効にする方法についてより詳細に説明します。


Footnotes

(11)

これにはいくつか例外があります。たとえばレキシカルバインディングは、Lispデバッガーからもアクセスできます。

This page has generated for branch:work/emacs-30_69b16e5c63840479270d32f58daea923fe725b90, commit:5e3f74b56ff47b5bcef2526c70f53f749bbd45f6 to check Japanese translation.