SICP 読み (314) 5.5 翻訳系

帰宅。日付をよく見りゃ今年も今日入れて四日ですか。いやはや。
それは良いとして、メシ喰って速攻で compile に吸わせてみた。allcode を使う場合は以下の手順で良いのだろうか。

  • load-path にソースがあるディレクトリを追加
  • load-eceval-compiler を load
  • ch5-compiler を load
  • true と false を define

で、gosh に以下の式

gosh> (compile '(define (factorial n) (if (= n 1) 1 (* (factorial (- n 1)) n))) 'val 'return)

を吸わせた出力の statement なナニを整形したものが以下。

((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 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-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) 
 (assign val (op lookup-variable-value) (const n) (reg env)) 
 (assign argl (op list) (reg val)) 
 (save argl) 
 (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 
 (restore argl) 
 (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)))

今回のソレは entry1 から開始されている。テキストのナニと見比べてみれば良かったんだ (今さら
一応正しい模様。それにしてもこーゆーカンは未だに正確だな。第六感デバッグ (爆
とりあえず続きは年賀状の宛名を書いてから、とゆー事で。