問題5.11 b. – SICP(計算機プログラムの構造と解釈)その259
2009年09月24日
問題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
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542