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 だったら良かったのかなぁ。ってーか逆に言えばこのあたりが駄目な所以か。動作確認は別途とゆー事で、もう少し余裕を持って振り返ってみたいと考えております。