述語を評価する前に, 帰結部か代替部を後で取り出せるよう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へ行く. envとcontinueの回復は, 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))
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))
28
これは本当は欺きではない. 無から構築した実際の実装では, 実行の前に走る構文フェーズでcond->ifのような原始プログラムレベル変換を実行するSchemeプログラムを解釈するのに, 積極制御評価器を使う.