ラムダ式と環境


Scheme では、 変数名のスコープルールは静的です。 すこし、下の例を見てみましょう。

> (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