LispのScheme方言では, defineを使って名前をつける.
(define size 2)と入力すると, 解釈系は値2と名前sizeを対応づける.8 ひと度名前sizeを値2と対応づけると, 名前で値2 を指すことが出来る:
size 2 (* 5 size) 10
defineの使用例を更にあげる:
(define pi 3.14159) (define radius 10) (* pi (* radius radius)) 314.159 (define circumference (* 2 pi radius)) circumference 62.8318
defineは, 上で計算したcircumferenceのような, 合成演算の結果を指すにも単純な名前を使うことが出来るので, われわれの言語の最も単純な抽象手段である. 一般に, 計算オブジェクトがとても複雑な構造を持ち, それを記憶しなければならないとか, 使う度に細部まで繰り返さなければならないとしたら, 極めて不便である. 実際,複雑なプログラムは, 複雑さが徐々に増える計算オブジェクトを, 一歩一歩と組み上げるように出来ている. 解釈系では, 名前とオブジェクトの対応づけが, 対話によって次々と出来上っていくから, この一歩一歩のプログラムの構成が特に便利になっている. この機能は, プログラムの漸次的開発とテストを奨励し, Lispプログラムが, 通常多くの比較的単純な手続きから構成されているという事実の根拠になっている.
値と記号を対応づけ, 後にそれが取り出せるためには, 解釈系は名前とオブジェクトの対を見失わないための, 何か記憶を保持していることに他ならないことは明らかである. この記憶を
環境(environment)(より正確には, 後になって計算は多くの異る環境に関るということが分る故に
大域環境(global environment))という.9
8
本書では解釈系が定義を評価した時の応答は示さない. それは実装に大きく依存するからである.
9
3章で, こういう環境の考えが, 解釈系の働きの理解と, 解釈系の実装とに重要なことが分る.