SICP 読み (281) 5.4 積極制御評価器

よく見りゃスデに 5.4 なんだ。(何

問題 5.24

以下の命令は使える、と見てるんですが

(define (cond? exp) (tagged-list? exp 'cond))
(define (cond-clauses exp) (cdr exp))
(define (cond-else-clause? clause)
  (eq? (cond-predicate clause) 'else))
(define (cond-predicate clause) (car clause))
(define (cond-actions clause) (cdr clause))

とりあえず clauses を切り分ける op も欲しいな。したら

ev-cond
    (assign exp (op cond-clauses) (reg exp))
ev-cond-loop
    (assign unev (op cdr) (reg exp))
    (assign exp (op car) (reg exp))
    (save exp)
    (save unev)
    (save exp)
    (save continue)
    (assign continue (label ev-cond-decide))
    (assign exp (op cond-predicate) (reg exp))
    (goto (eval-dispatch))

ev-cond-decide
    (restore continue)
    (restore exp)
    (restore unev)
    (restore exp)
    (test (op true?) (reg val))
    (branch (label ev-cond-consequent))
    (assign exp (reg unev))
    (goto (label ev-cond-loop))

みたいな感じ?? (無理矢理 car とか cdr 使ってますが良いのかなぁ) って else なソレがスルーだな。どこで聞けば良いのか。eval にトバす前に、かな。
とり急ぎ朝イチ検討のメモ、とゆー事で。

メシ食いながら

考えてみた。以下でどうか。検証は別途で。

ev-cond
    (assign exp (op cond-clauses) (reg exp))

ev-cond-loop
    (assign unev (op cdr) (reg exp))
    (assign exp (op car) (reg exp))
    (test (op cond-else-clause?) (reg exp))
    (branch (label ev-cond-consequent))
    (save exp)
    (save unev)
    (save exp)
    (save continue)
    (assign continue (label ev-cond-decide))
    (assign exp (op cond-predicate) (reg exp))
    (goto (eval-dispatch))

ev-cond-decide
    (restore continue)
    (restore exp)
    (restore unev)
    (restore exp)
    (test (op true?) (reg val))
    (branch (label ev-cond-consequent))
    (assign exp (reg unev))
    (goto (label ev-cond-loop))

ev-cond-consequent
    (assign exp (op cond-actions) (reg exp))
    (goto (label eval-dispatch))

検証

exp の退避と復帰がカブッてたので修正

ev-cond
    (assign exp (op cond-clauses) (reg exp))

ev-cond-loop
    (assign unev (op cdr) (reg exp))
    (assign exp (op car) (reg exp))
    (test (op cond-else-clause?) (reg exp))
    (branch (label ev-cond-consequent))
    (save exp)
    (save unev)
    (save continue)
    (assign continue (label ev-cond-decide))
    (assign exp (op cond-predicate) (reg exp))
    (goto (eval-dispatch))

ev-cond-decide
    (restore continue)
    (restore unev)
    (restore exp)
    (test (op true?) (reg val))
    (branch (label ev-cond-consequent))
    (assign exp (reg unev))
    (goto (label ev-cond-loop))

ev-cond-consequent
    (assign exp (op cond-actions) (reg exp))
    (goto (label eval-dispatch))

なんとなく動きそげ、ではあるんですが ...
でもこれって、else ナシで最後の述語も #f だったトキのナニが微妙かも。val レジスタに #f ツッコんで goto (label continue) すれば良いのかなぁ。これは別途実機で確認が必要。

も少し

考えてみた。

ev-cond
    (assign exp (op cond-clauses) (reg exp))

ev-cond-loop
    (test (op null?) (reg exp))
    (branch (label ev-cond-false))
    (assign unev (op cdr) (reg exp))
    (assign exp (op car) (reg exp))
    (test (op cond-else-clause?) (reg exp))
    (branch (label ev-cond-consequent))
    (save exp)
    (save unev)
    (save continue)
    (assign continue (label ev-cond-decide))
    (assign exp (op cond-predicate) (reg exp))
    (goto (eval-dispatch))

ev-cond-decide
    (restore continue)
    (restore unev)
    (restore exp)
    (test (op true?) (reg val))
    (branch (label ev-cond-consequent))
    (assign exp (reg unev))
    (goto (label ev-cond-loop))

ev-cond-consequent
    (assign exp (op cond-actions) (reg exp))
    (goto (label eval-dispatch))

ev-cond-false
    (assign val (const false))
    (goto (reg continue))

うーん ...
# (const false) って ...