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

5.4.3 条件式, 代入および定義



超循環評価器と同様, 特殊形式は式の部分部分を選択的に評価して扱う. if式では述語を評価し, 述語の値に従って帰結部を評価するか代替部を評価するかを決めなければならない.

   述語を評価する前に, 帰結部か代替部を後で取り出せるようif式自身を退避する. また帰結部か代替部を評価するのに, 後で必要になるであろう環境を退避し, またifの値を待っている式の評価に戻るのに後で必要になるであろうcontinueも退避する.


ev-if
  (save exp)                    ; 後のために式を退避
  (save env)
  (save continue)
  (assign continue (label ev-if-decide))
  (assign exp (op if-predicate) (reg exp))
  (goto (label eval-dispatch))  ; 述語を評価

   述語の評価から戻ると, それが真か偽かをテストし, その結果により帰結部か代替部かをexpに置き, eval-dispatchへ行く. envcontinueの回復は, eval-dispatchが正しい環境を持ち, if式の値を受けとる正しい場所に続行するよう設定することに注意しよう.

ev-if-decide
  (restore continue)
  (restore env)
  (restore exp)
  (test (op true?) (reg val))
  (branch (label ev-if-consequent))
ev-if-alternative
  (assign exp (op if-alternative) (reg exp))
  (goto (label eval-dispatch))
ev-if-consequent
  (assign exp (op if-consequent) (reg exp))
  (goto (label eval-dispatch))
代入と定義
代入はeval-assignmentが扱う. そこにはexpに代入式を持ってev-dispatchから到達する. ev-assignmentのプログラムはまず式の値の部分を評価し, 次に環境で新しい値を組み込む. set-variable-value!は機械演算として使用可能と仮定する.

ev-assignment
  (assign unev (op assignment-variable) (reg exp))
  (save unev)                   ; 後のために変数を退避
  (assign exp (op assignment-value) (reg exp))
  (save env)
  (save continue)
  (assign continue (label ev-assignment-1))
  (goto (label eval-dispatch))  ; 代入する値を評価
ev-assignment-1
  (restore continue)
  (restore env)
  (restore unev)
  (perform
   (op set-variable-value!) (reg unev) (reg val) (reg env))
  (assign val (const ok))
  (goto (reg continue))

   定義も同様に扱う:


ev-definition
  (assign unev (op definition-variable) (reg exp))
  (save unev)                   ; 後のために変数を退避
  (assign exp (op definition-value) (reg exp))
  (save env)
  (save continue)
  (assign continue (label ev-definition-1))
  (goto (label eval-dispatch))  ; 定義する値を評価
ev-definition-1
  (restore continue)
  (restore env)
  (restore unev)
  (perform
   (op define-variable!) (reg unev) (reg val) (reg env))
  (assign val (const ok))
  (goto (reg continue))

問題 5.23


評価器を拡張し, cond, letなどのような導出された式(4.1.2節)が扱えるようにせよ. cond->ifのような構文変換器が, 機械演算として使用可能なように「欺き」また仮定してよい.28

問題 5.24


condifへは簡約せず, 新しい基本的特殊形式として実装せよ. cond節の述語を順に, 真のものを見つけるまでテストするループを構成し, 次にev-sequenceを使い, その節の行動を評価しなければならない.

問題 5.25


評価器を修正し, 4.2節の遅延評価器に基づいた正規順序の評価が使えるようにせよ.



28 これは本当は欺きではない. 無から構築した実際の実装では, 実行の前に走る構文フェーズでcond->ifのような原始プログラムレベル変換を実行するSchemeプログラムを解釈するのに, 積極制御評価器を使う.

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