問題5.11 b. – SICP(計算機プログラムの構造と解釈)その259

問題5.11 b.

スタックの save でレジスタ名とその値をペアにして保存し、restore でレジスタ名のチェックを行う。

(define (make-save inst machine stack pc)
  (let ((reg-name (stack-inst-reg-name inst)))
       (let ((reg (get-register machine reg-name)))
            (lambda ()
                    (push stack (cons reg-name (get-contents reg)))
                    (advance-pc pc)))))

(define (make-restore inst machine stack pc)
  (let ((reg-name (stack-inst-reg-name inst)))
       (let ((reg (get-register machine reg-name)))
            (lambda ()
                    (let ((head-of-stack (pop stack)))
                         (if (eq? (car head-of-stack) reg-name)
                             (set-contents! reg (cdr head-of-stack))
                             (error "Wrong register name - RESTORE" reg-name)))
                    (advance-pc pc)))))

実行結果

(define test-machine
  (make-machine
    '(a b)
    '()
    '(start
       (assign a (const 1))
       (assign b (const 2))
       (save a)
       (save b)
       (restore a)
       (restore b)
       (goto (label done))
      done)))

(start test-machine)
gosh> test-machine
(print "a is "
         (get-register-contents test-machine 'a))
(print "b is "
         (get-register-contents test-machine 'b))
gosh> *** ERROR: Wrong register name - RESTORE a
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»