ローカル変数のバインディングは、 ((変数 . 値) ...) という pair のリストである association リストでインプリメントされている、と見ることができます。このリスト の前に新しいバインディングを追加すると、リストのずっと下の方に存在する(同じ)変 数に対するバインディングは見えなくなります。 (バインディングを作った)フォーム を exit すると、前のフォームが(再び)見えるようになります。ローカルバインディン グが存在しない場合、グローバル値が見えます。
ローカル変数をバインドするフォームは、関数呼び出し(チャプター 10 [関数]、ペ ージ 83 参照)、マクロ呼び出し(チャプター 11 [マクロ]、ページ 91 参照)、特殊 フォーム let, let*、 condition-case (セクション 12.7 [condition-case]、ペー ジ 108 参照) です。(他には??)
Special Form: let binding-list forms*
この関数は、 binding-list に従い変数をバインドし、 forms 中の全てのフォー ムを順に評価します。 let は (forms 中の)最後のフォームの値を返します。
binding-list の各要素は、シンボル(この場合、そのシンボルは nil にバインド される)か、フォーム (symbol value-form) のリスト(この場合、let は value- form を評価した結果を symbol にバインドする) です。
フォーム(の全て)を評価する前に let フォームを exit した場合、 (訳注:バイ ンドされた)シンボルのローカルバインディングを取り去ります。
value-form はシンボルのバインディングを行なう前に (全て)、現われた順に評価 されます(これにたよることができる??)。次の例において、Z は Y の前の値(2)に バインドされ、新しい値にはバインドされません。
(setq Y 2) => 2 (let (X (Y 1) (Z Y)
(list X Y Z)) => (nil 1 2)
Special Form: let* binding-list forms*
この特殊フォームは、 binding-list の各シンボルを(残りのシンボルをバインド する前に) 与えられた順にバインドする点を除いて、let と同じです。このため binding-list 中の式は、この binding-list で(すでに)バインドされたシンボル を参照することができます。以下に示した例を let に対する例と比較してみて下 さい。
(setq Y 2) => 2 (let* (X (Y 1) (Z Y)) (list X Y Z)) => (nil 1 1)