[ 目次, 前節, 次節, 索引 ]

4.1  超循環評価器



われわれのLispの評価器はLispプログラムとして実装する. LispプログラムをLispで実装した評価器を使って評価すると考えると, 循環しているように見えるかも知れない. しかし評価はプロセスであり, 評価プロセスをLispを使って記述するのは適切なことである. Lispは結局プロセスを記述する道具なのである.3 それが評価する言語と同じ言語で書いてある評価器は, 超循環(metacircular)であるという.

   超循環評価器は, 本質的に3.2節に述べた評価の環境モデルのSchemeによる形式化である. そのモデルには二つの基本部分があったことを思い出そう:

1. (特殊形式以外の合成式である)組合せを評価するには, 部分式を評価し, 演算子の部分式の値を, 被演算子の部分式の値に作用させる.

2. 合成手続きを一組の引数に作用させるには, 手続き本体を新しい環境で評価する. この環境を構成するには, 手続きオブジェクトの環境部分を, 手続きの仮パラメタが, 手続きを作用させる引数に束縛されるフレームで拡張する.

   この二つの規則は, 評価プロセスの本質を記述する. 環境の中で評価される式は, 引数に作用させる手続きへ簡約され, それは新しい環境で評価する新しい式へ簡約され, これを繰り返し, 遂には, その値が環境の中で求められる記号か, 直接作用させる基本手続きかにたどり着く(図4.1参照).4 評価の循環は評価における二つの重要な手続き, evalapplyの間の相互作用で具体化される. それらを4.1.1節で述べる(図4.1参照).

   評価器の実装は評価される式の構文(syntax)を定義する手続きに依存する. われわれは データ抽象を使い, 評価器が言語の表現と独立になるようにする. 例えば代入は記号set!で始るリストで表現するという選択をしてしまうのではなく, 抽象述語assignment?を使って代入をテストし, 抽象選択子assignment-variableassignment-valueを使って代入の要素にアクセスする. 式の実装は4.1.2節に詳しく述べる. また4.1.3節にある演算は, 手続きと環境の表現を規定する. 例えばmake-procedureは合成手続きを構成し, lookup-variable-valueは変数の値にアクセスし, apply- primitive-procedureは基本手続きを与えられた引数のリストへ作用させる.


3 それにしてもわれわれの評価器によって説明出来ない評価プロセスの重要な点が残る. その最も重要なのは,手続きが別の手続きを呼び出し, 呼出し側に値を返す詳細な機構である. この点に関しては5章で論じよう. そこでは評価器を単純なレジスタ計算機として実装し, 評価プロセスを詳細に見ることにする.

4 基本手続きを作用させる能力を認めると, 評価器の実装では何が残るのか. 評価器の仕事は言語の基本手続きを規定することではなく, 基本手続きの集まりを結んで言語とする連結組織---合成の手段と抽象の手段---を提供することである. 特に:

• 評価器は入れ子の式を扱えるようにする. 例えば単に基本操作の作用は式(+ 1 6)の評価には十分でも, (+ 1 (* 2 3))を扱うには不十分である. 基本手続き+だけに関しても, その引数は数値でなければならず, 引数に式(* 2 3)を渡せば窒息するであろう. 評価器の重要な仕事の一つは(* 2 3)+に渡される前に6に簡約されるよう, 手続き構成を振りつけることである.

• 評価器は変数の使用を許す. 例えば加算の基本手続きは(+ x 1)のような式の扱いを知らない. 評価器は変数を覚えておき, 基本手続きを呼び出す前に値を得る必要がある.

• 評価器は合成手続きの定義を許す. そのため手続き定義を覚えておかなければならない. 式を評価するのにこの定義をどう使うかを知り, 手続きが引数にアクセス出来るような機構を用意しなければならない.

• 評価器は特殊形式を用意する. それは手続き呼出しとは別に評価しなければならない.

[ 目次, 前節, 次節, 索引 ]