SICP 読み (351) 5.5 翻訳系

今日は集中して作業できる日だったので実作業も現実トウヒもそれなりの成果。寿命が近い機器の移行検討をしたんですが、すぐに試験したくなってしまってたりして (何
この位のナニで SICP の残りも、なんですがなかなかハードル高い。

問題 5.45

ええと、とりあえず以下の手続き

(define (factorial n)
  (if (= n 0)
      1
      (* n (factorial (- n 1)))))

を compile してみた。多分何度も引用してるんだろうな。(とほほ

((assign val (op make-compiled-procedure) (label entry1) (reg env)) 
 (goto (label after-lambda2)) 
 entry1 
 (assign env (op compiled-procedure-env) (reg proc)) 
 (assign env (op extend-environment) (const (n)) (reg argl) (reg env)) 

 (save continue) 
 (save env)

 (assign proc (op lookup-variable-value) (const =) (reg env)) 
 (assign val (const 0)) 
 (assign argl (op list) (reg val)) 
 (assign val (op lookup-variable-value) (const n) (reg env)) 
 (assign argl (op cons) (reg val) (reg argl)) 
 (test (op primitive-procedure?) (reg proc)) 
 (branch (label primitive-branch6)) 
 compiled-branch7 
 (assign continue (label after-call8)) 
 (assign val (op compiled-procedure-entry) (reg proc)) 
 (goto (reg val)) 
 primitive-branch6 
 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) 
 after-call8 

 (restore env) 
 (restore continue) 

 (test (op false?) (reg val)) 
 (branch (label false-branch4)) 
 true-branch3 
 (assign val (const 1)) 
 (goto (reg continue)) 
 false-branch4 
 (assign proc (op lookup-variable-value) (const *) (reg env)) 

 (save continue) 
 (save proc) 
 (save env) 

 (assign proc (op lookup-variable-value) (const factorial) (reg env)) 

 (save proc) 

 (assign proc (op lookup-variable-value) (const -) (reg env)) 
 (assign val (const 1)) 
 (assign argl (op list) (reg val)) 
 (assign val (op lookup-variable-value) (const n) (reg env)) 
 (assign argl (op cons) (reg val) (reg argl)) 
 (test (op primitive-procedure?) (reg proc)) 
 (branch (label primitive-branch9)) 
 compiled-branch10 
 (assign continue (label after-call11)) 
 (assign val (op compiled-procedure-entry) (reg proc)) 
 (goto (reg val)) 
 primitive-branch9 
 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) 
 after-call11 
 (assign argl (op list) (reg val)) 

 (restore proc) 

 (test (op primitive-procedure?) (reg proc)) 
 (branch 
  (label primitive-branch12)) 
 compiled-branch13 
 (assign continue (label after-call14)) 
 (assign val (op compiled-procedure-entry) (reg proc)) 
 (goto (reg val)) 
 primitive-branch12 
 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) 
 after-call14 
 (assign argl (op list) (reg val)) 

 (restore env) 

 (assign val (op lookup-variable-value) (const n) (reg env)) 
 (assign argl (op cons) (reg val) (reg argl)) 

 (restore proc) 
 (restore continue) 

 (test (op primitive-procedure?) (reg proc)) 
 (branch (label primitive-branch15)) 
 compiled-branch16 
 (assign val (op compiled-procedure-entry) (reg proc)) 
 (goto (reg val)) 
 primitive-branch15 
 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) 
 (goto (reg continue)) 
 after-call17 
 after-if5 
 after-lambda2 
 (perform (op define-variable!) (const factorial) (reg val) (reg env)) 
 (assign val (const ok)) 
 (goto (reg continue)))

見たら分かりますが整形済み。着目しないとイケないのは save/restore なんですが、上記のリストを便宜的にケズったらもう少しわかり易くなりそうだな、と思いつつ中断。