Next: Void Variables, Previous: Constant Variables, Up: Variables [Contents][Index]
グローバル変数は、新しい値で明示的に置き換えるまで値が持続します。変数にローカル値(local value) — Lispプログラム内の特定の部分で効果をもつを与えると便利なときがあります。変数がローカル値をもつとき、わたしたちは変数がその値にローカルにバインド(locally bound)と言い、その変数をローカル変数(local variable)と呼びます。
たとえば、関数が呼び出されるとき、関数の引数となる変数はローカル値(その関数の呼び出しにおいて実際の引数に与えられた値)を受け取ります。これらのローカルバインディングは、その関数のbody内で効果をもちます。他にも、たとえばスペシャルフォームlet
は特定の変数にたいして明示的にローカルなバインディングを確立し、これはlet
フォームのbody内で効果を持ちます。
これにたいしてグローバルなバインディング(global binding)とは、(概念的には)グローバルな値が保持される場所です。
ローカルバインディングを確立すると、その変数の以前の値は他の場所に保存されます(または失われます)。わたしたちはこれを、以前の値がシャドーされた(shadowed)と言います。シャドーはグローバル変数とローカル変数の両方で発生し得ます。ローカルバインディングが効果を持つとき、ローカル変数にsetq
を使用することにより、ローカルバインディングに指定された値を格納します。ローカルバインディングが効果を持たなくなったとき、以前にシャドーされた値が復元されます(または失われます)。
変数は同時に複数のローカルバインディングを持つことができます(たとえばその変数をバインドするネストされたlet
)。カレントバインディング(current
binding)とは、実際に効果を持つローカルバインディングのことです。カレントバインディングは、その変数の評価によりreturnされる値を決定し、setq
により影響を受けるバインディングです。
ほとんどの用途において、“最内(innermost)”のローカルバインディング、ローカルバインディングがないときはグローバルバインディングを、カレントバインディングと考えることができます。より正確に言うと、スコープルール(scoping rule)と呼ばれるルールは、プログラム内でローカルバインディングが効果を持つ任意の与えられた場所を決定します。Emacs Lispのスコープルールはダイナミックスコープ(dynamic scoping)と呼ばれ、これは単に実行中のプログラム内の与えられた位置でのカレントバインディングを示し、その変数がまだ存在する場合は、その変数にたいしてもっとも最近作成されたバインディングです。ダイナミックスコープについての詳細と、その代替であるレキシカルスコープ(lexical scoping)と呼ばれるスコープルールについては、Variable Scopingを参照してください。
スペシャルフォームlet
およびlet*
は、ローカルバインディングを作成するために存在します:
このスペシャルフォームは、bindingsにより指定される特定の変数セットにたいするローカルバインディングをセットアップしてから、formsのすべてをテキスト順に評価します。これはforms内の最後のフォームの値をreturnします。
bindingsの各バインディングは2つの形式のどちらかです。(i)
シンボルの場合。この場合、そのシンボルはnil
にローカルにバインドされます。(ii)
フォーム(symbol
value-form)
のリストの場合。この場合symbolはvalue-formを評価した結果にローカルにバインドされます。value-formが省略された場合は、nil
が使用されます。
bindings内のすべてのvalue-formは、シンボルがそれらにバインドされる前に、記述された順番に評価されます。以下は例では、z
はy
の新しい場合(つまり1)にではなく、古い値(つまり2)にバインドされます。
(setq y 2) ⇒ 2
(let ((y 1) (z y)) (list y z)) ⇒ (1 2)
このスペシャルフォームはlet
と似ていますが、次の変数値にたいするローカル値を計算する前に、ローカル値を計算してそれを変数にバインドします。したがて、bindings内の式は、このlet*
フォーム内の前のシンボルのバインドを参照できます。以下の例を、上記let
の例と比較してください。
(setq y 2) ⇒ 2
(let* ((y 1)
(z y)) ; y
の値に今計算されたばかりの値を使用する。
(list y z))
⇒ (1 1)
以下は、ローカルバインディングを作成する、他の機能のリストです:
変数はバッファーローカルなバインディングを持つこともできます(Buffer-Local Variablesを参照してください)。数は多くありませんが、端末ローカル(terminal-local)なバインディングをもつ変数もあります(Multiple Terminalsを参照してください)これらの種類のバインディングは、通常のローカルバインディングのように機能することもありますが、これらはEmacs内の“どこ”であるかに依存してローカライズされます。
この変数は、ローカルな変数バインディングと、unwind-protect
にゆるクリーンアップ(Cleaning Up from Nonlocal
Exitsの総数にたいする制限を定義し、この変数を越えるとEmacsはエラー(データに関するエラー"Variable binding
depth exceeds max-specpdl-size"
)をシグナルします。
このリミットは、もし超過したときにエラーが関連付けられている場合には、誤って定義された関数による無限再起を避けるための1つの方法になります。ネストの深さにたいする他の制限としては、max-lisp-eval-depth
があります。Evalを参照してください。
デフォルト値は1300です。Lispデバッガーのエントリーしたとき、もし残りが少ないときは、デバッガーを実行するための空きを作るために、値は増加されます。