問題5.8 – SICP(計算機プログラムの構造と解釈)その256

問題5.8

1つめの here から there に達したとき、2つめの here には制御は移らないため、レジスタ a の内容は 3 となる。

(define test-machine
  (make-machine
    '(a)
    '()
    '(start
       (goto (label here))
      here
       (assign a (const 3))
       (goto (label there))
      here
       (assign a (const 4))
       (goto (label there))
      there)))

実行結果

(set-register-contents! test-machine 'a 0)
gosh> done
(start test-machine)
gosh> done
(get-register-contents test-machine 'a)
gosh> 3

重複するラベル名を見つけた場合にエラーとするよう修正した extract-labels 手続き。

(define (extract-labels text receive)
  (if (null? text)
      (receive '() '())
      (extract-labels (cdr text)
                      (lambda (insts labels)
                              (let ((next-inst (car text)))
                                   (if (symbol? next-inst)
                                       (if (assoc next-inst labels)
                                           (error "Multiply defined label: " next-inst)
                                           (receive insts
                                                    (cons (make-label-entry next-inst
                                                                            insts)
                                                          labels)))
                                       (receive (cons (make-instruction next-inst)
                                                      insts)
                                                labels)))))))

修正したシミュレータで実行した場合。
ラベルの重複エラーはアセンブリ時に検出される。

gosh> *** ERROR: Multiply defined label:  here
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»