> (let* ((x 1) (p (lambda (y) (+ x y)))) (let ((x 2)) (p 100))) 101
では、実行の過程をおってみましょう。 まず、 x に 1 という値を束縛し、 その環境(変数と値の束縛状態のこと)で p を (lambda (y) (+ x y)) に束縛しています。 Scheme のように静的スコープを行っている言語では、 ラムダ式の中に現われる x は、 このラムダ式が生成された時点での環境によって解決されます。 つまり、 x : 1 と束縛されているわけです。
このため、プログラムは x: 2 と束縛された環境において、 (p 100) を評価しようとしていますが、 p のラムダ式の中の x の値は、 1 になります。 (参考: 動的スコープの場合)
この様に、ラムダ式が値として使われている場合、 ラムダ式の文面 (この場合 (lambda (y) (+ x y)) )だけではなく、 ラムダ式が作られたときの環境 ( x が 1に束縛されているという情報)も一緒に 渡されていると考えられます。 このように値としてラムダ式を扱うには、 ラムダ式と環境を組として考える必要があるわけですが、 この組のことをlambda closure と呼びます。 ラムダ式のなかに現われる自由変数の値は、この環境によって決定されます。
99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp