SICP 読み (240) 5.1 レジスタ計算機の設計
DRY なソレをどう解決していくか、なソレから始まって繰返しではない再帰にまで話が至ってしまっています。例示されている factorial だの fib だのというソレ達は机上トレイスな問題がある模様。
問題 5.4
まず a.からですが factorial な例を見つつ無理矢理でっち上げてみる。ってか、factorial な例を見てるにヤッてはいかんと思っていた
val += b
みたいなコトをしているな。直前なエントリで無理矢理レジスタを作っていたんですが、これはセイフとゆー事なんですか。
(controller (assign continue (label expt-done)) expt-loop (test (op =) (reg n) (const 0)) (branch (label base-case)) (save continue) (save n) (assign n (op -) (reg n) (const 1)) (assign continue (label after-expt)) (goto (label expt-loop)) after-expt (restore n) (restore continue) (assign val (op *) (reg b) (reg val)) (goto (reg continue)) base-case (assign val (const 1)) (goto (reg continue)) expt-done)
みたいなソレができた。このボーナスステイジは何とか教材にならんかな、ってこれ自体がスデに教材なんだった。一応データパスなマンガも書いておきますが、こちらへのアプは略。
とりあえず b.も検討。
(controller (assign c (reg n)) (assign p (const 1)) test-b (test (op =) (reg c) (const 0)) (branch (label expt-done)) (assign t1 (op -) (reg c) (count 1)) (assign t2 (op *) (reg b) (reg p)) (assign c (reg t1)) (assign p (reg t2)) (goto (label test-b)) expt-done)
これってテンポラリなソレを使わずに
(controller (assign c (reg n)) (assign p (const 1)) test-b (test (op =) (reg c) (const 0)) (branch (label expt-done)) (assign c (op -) (reg c) (count 1)) (assign p (op *) (reg b) (reg p)) (goto (label test-b)) expt-done)
ってのもありなのかどうか。でも例示されてる factorial だの fib だので平気で使われておりますな。多分セイフではないかと。
イキオイが持続すれば続きなソレを追記かも。ってマンガ書くのを忘れてるな。今からテキストに (以下略