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) って ...