問題5.14 – SICP(計算機プログラムの構造と解釈)その263
問題5.14 シミュレーターに 5.2.4 の修正を加えて、図5.11の階乗計算機を実行する。 (define fact-machine (make-machine ‘(continue val n) (list (list ‘= =) (list ‘- -) (list ‘* *)) ‘(start (assign continue (label fact-done)) fact-loop (t…続きを読む
問題5.14 シミュレーターに 5.2.4 の修正を加えて、図5.11の階乗計算機を実行する。 (define fact-machine (make-machine ‘(continue val n) (list (list ‘= =) (list ‘- -) (list ‘* *)) ‘(start (assign continue (label fact-done)) fact-loop (t…続きを読む
問題5.13 make-new-machine の lookup-register 手続きで、引数 name に該当するレジスタが見つからない場合に name レジスタを作成するように変更する。 ;;;; 修正前の make-new-machine (define (make-new-machine) ;; 省略 (define (lookup-register name) (let ((val …続きを読む
問題5.12 計算機を作る際に解析器 analyzer を実装する。 (define (make-new-machine) (let ((pc (make-register ‘pc)) (flag (make-register ‘flag)) (stack (make-stack)) (analyzer (make-analyzer)) ;; 解析器を追加する (the-instruction-s…続きを読む
レジスタ名毎にスタックを用意し、スタック操作はレジスタ名を引数にとってチェックする。 スタックは連想リストを使ってレジスタ名と値のリストの形にする。 (define (make-stack) (let ((s ‘())) (define (push reg-name x) (let ((reg-stack (assoc reg-name s))) (if #?=reg-stack ;; リーダーマ…続きを読む
問題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))) (la…続きを読む
問題5.11 a. afterfib-n-2 の内容を次のように変更できる。 afterfib-n-2 (assign n (reg val)) (restore val) … ↓ afterfib-n-2 (restore n) … 問題5.6のように (fib 4) として、スタックの処理内容を書き出してみる。 ; [n] [val] [continue] [stack] (test …続きを読む
問題5.9 (define (make-operation-exp exp machine labels operations) (let ((op (lookup-prim (operation-exp-op exp) operations)) (aprocs (map (lambda (e) (if (label-exp? e) (error "Operations can be u…続きを読む
問題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 (as…続きを読む
問題5.7 再帰的べき乗を計算する計算機 (define expt-machine (make-machine ‘(b n val continue) (list (list ‘= =) (list ‘* *) (list ‘- -)) ‘((assign continue (label expt-done)) expt-loop (test (op =) (reg n) (const 0)) (…続きを読む
問題5.7、問題5.8 を解く前にレジスタ計算機シミュレータを実装しておく。 5.2節のコードをそのまま写すだけで Gauche でも問題なく動作した。 ;;;; 5.2.1 計算機モデル (define (make-machine register-names ops controller-text) (let ((machine (make-new-machine))) (for-each (…続きを読む