#3.2 評価の環境モデル
第1章で合成手続きを導入した時は、引数に手続きを適用するとはどういうことなのか定義するために、 置き換えモデルを使った(1.1.5)。 つまり、
- 合成手続きに引数を適用するとは、「仮パラメータをそれぞれ対応した引数に置き換えた上で、 手続きの本体を評価する」
ということである。 プログラミング言語に代入を取り入れると、この定義ではもはや適切でなくなってしまう。
特に変数は、3.1.3節で検討したように、 代入が存在する場合には単純に値に対する名前と考えることができなくなってしまった。 変数はむしろ、値を保存しておくための「場所」を何らかの方法で与えるものでなければならない。 新しい評価のモデルでは、この「場所」を環境という構造で管理する。
環境とは、フレームが並んでいるもののことである。 フレームとは、変数の名前と、それに束縛する値の表のことである(何もない場合もある)。 (1つのフレームの中では、どの変数にも多くて1つの値が束縛されている。) フレームがグローバル(大域)を検討するためのものでない限り、 それぞれのフレームにはフレームを含んだ環境へのポインタがある。 ある環境から見たときの変数の値は、 その変数が束縛されている最初のフレームの中での束縛によって与えられた値である。 どのフレームの並びもその変数の束縛していない時、変数はその環境の中では未束縛(unbound)であるという。
図3.1 単純な環境の構造
図3.1はI,II,III、3つのフレームからなる単純な環境の構造である。図中のA,B,C,Dは環境へのポインタである。 CとDは同じ環境を指し示している。 変数zとxはフレームIIで束縛され、yとxはフレームIで束縛されている。 環境Dでのxの値は3である。 環境Bでのxの値も3である。
これは以下の経過で決定される。 フレームの並びの最初のもの(フレームIII)を調べると、xへの束縛は見つからない。 続いて外側の環境Dへ進み、フレームIで束縛が見つかる。 また、環境Aでのxの値は、フレームの並びの最初のもの(フレームII)でxの7への束縛を含んでいるため、7である。 環境Aから見て、フレームIIでのxの7への束縛が、フレームIでのxの3への束縛を隠している(shadow)という。
環境は、式を評価する文脈を定義するものなので、評価のプロセスにとって非常に重要なものである。 それどころか、プログラミング言語の式は、それ自身では何も意味しないと言えるだろう。 むしろ、式はそれが評価される環境にしたがってはじめて意味を持つのである。
(+ 1 1)のような簡単な式の解釈ですら、 + が加算のシンボルとなる文脈で実行されるという理解の上に成り立っている。 つまり、この評価のモデルでは、式の評価をする場合は常に、何らかの環境にしたがって行われている。 解釈系とのやりとりを説明する時には、基本的な手続きのシンボルと、それに対応する値を含んだ (外側の環境を持たない)単一のフレームからなる大域環境を考えることになるだろう。 たとえば、+が加算のシンボルであるということは、 +というシンボルが大域環境では基本加算手続きに束縛されていると説明できる。