SICP 読み (262) 5.2 レジスタ計算機での計算
次の問題に進みたいトコロではあるのですが、気になる点がいくつかある。
- リストの出力順
- テンパッた根拠なバグについて
まずはリストの出力順ですが、例えば assign なリストが以下。
(assign ((assign n (reg val)) (restore val) (restore continue) (assign val (op +) (reg val) (reg n)) (goto (reg continue)) (assign val (reg n)) (goto (reg continue))) ((restore n) (restore continue) (assign n (op -) (reg n) (const 2)) (save continue) (assign continue (label afterfib-n-2)) (save val) (goto (label fib-loop)) (assign n (reg val)) (restore val) (restore continue) (assign val (op +) (reg val) (reg n)) (goto (reg continue)) (assign val (reg n)) (goto (reg continue))) ())
ケツから update-insts! って思い込みがありました。ケツからナニされるのは update-insts! に渡す labels と insts を用意している段階で、それらが準備 OK になった時点で、update-insts! にどさっと渡しているのであって、実際の assemble は先頭からヤッテるんだな、と。
なので
(cons (label fib-done) '()) (cons (label fib-afterfib-n-1) ((label fib-done))) (cons (label fib-afterfib-n-2) ((label fib-afterfib-n-1) (label fib-done)))
なリストになってる、という事ッスか。ちょっとスッキリ、がしかしバグったナニは振り返りたくないなぁ。(を
とりあえず、元気があれば、とゆー事で。(こら
続 (バグったナニ
えらそーにバグ入りのソレをアナウンスしたのが以下。
(define (set-list-of-inst l) (let ((elem (assoc (car l) list-of-inst))) (if elem (set-car! (cadr elem) (cadr l)) (set! list-of-inst (cons l list-of-inst)))) 'done)
set-car! してるんでカブさる。当分の間、なんで一つしかリストが無いのだ、というループに入っていたのが昨晩の事のように、って昨晩だし。(とほほほ
何故かは知らんが次に append している模様。こんな感じでしょうか。
(define (set-list-of-inst l) (let ((elem (assoc (car l) list-of-inst))) (if elem (append elem (cdr l)) (set! list-of-inst (cons l list-of-inst)))) 'done)
これは酷い。こんなコトもしています。
(define (set-list-of-inst l) (let ((elem (assoc (car l) list-of-inst))) (if elem (let ((tmp (cadr elem))) (set! tmp (cons (cadr l) tmp))) (set! list-of-inst (cons l list-of-inst)))) 'done)
これはもしかして cadr でなく cdr だったら良かったのかなぁ。ってーか逆に言えばこのあたりが駄目な所以か。動作確認は別途とゆー事で、もう少し余裕を持って振り返ってみたいと考えております。