SICP 読み (239) 5.1 レジスタ計算機の設計

とゆー事でボーナスステイジ突入。マンガは直接テキストに書いてたりしてますが、アプは略、とゆー事で。

問題 5.2

こんなカンジになるんでしょうか。

(controller
 (assign c (const 1))
 (assign p (const 1))
 test-b
 (test (op >) (reg n) (reg c))
 (branch (label factorial-done))
 (assign t1 (op +) (reg c) (count 1))
 (assign t2 (op *) (reg c) (reg p))
 (assign c (reg t1))
 (assign p (reg t2))
 (goto (label test-b))
 factorial-done)

テキストに答えをガンガン書いてる状態だったりします。(何

問題 5.3

ええと、最初の版はこんな感じだろうか。improve と good-enough? は基本演算として使えると仮定。

(controller
 test-b
 (test (op good-enough?) (reg g))
 (branch (lebel sqrt-done))
 (assign t (op improve) (reg g))
 (assign g (reg t))
 (goto (label test-b))
 sqrt-done)

improve を展開してみる次の版は x なレジスタが必要。ここでも average は基本演算と仮定 (good-enough? も)

(controller
 test-b
 (test (op good-enough?) (reg g))
 (branch (label sqrt-done))
 (assign t2 (op /) (reg x) (reg g))
 (assign t1 (op average) (reg g) (reg t2))
 (assign g (reg t1))
 (goto (label test-b))
 sqrt-done)

次の版は average を展開してみる。

(controller
 test-b
 (test (op good-enough?) (reg g))
 (branch (label sqrt-done))
 (assign t2 (op /) (reg x) (reg g))
 (assign t3 (op +) (reg t2) (reg g))
 (assign t1 (op /) (reg t3) (constant 2))
 (assign g (reg t1))
 (goto (label test-b))
 sqrt-done)

で良いのかなぁ。さらに good-enough? も展開。square と abs は基本演算ってコトで。

(controller
 test-b
 (assign t4 (op square) (reg g))
 (assign t5 (op -) (reg t4) (reg g))
 (assign t6 (op abs) (reg t5))
 (test (op <) (reg t6) (constant 0.001))
 (branch (label sqrt-done))
 (assign t2 (op /) (reg x) (reg g))
 (assign t3 (op +) (reg t2) (reg g))
 (assign t1 (op /) (reg t3) (constant 2))
 (assign g (reg t1))
 (goto (label test-b))
 sqrt-done)

で良いのかなぁ。テンポラリなレジスタの名前が微妙。この先も読んでるんですがなかなか面白い。それは良いのですが、この先どっち方面に進んでいくのだろうか。