SICP 読み (243) 5.2 レジスタ計算機での計算
もの凄いスピード感。これは一種の vm なんだろうか、と言いつつざくざく進んでいく。現在アセンブラな部分でちょっと停滞している状態ッス。とりあえず問題 5.7 を。
問題 5.7
これはシミュレータがまだ無いので机上ベースで。シミュレータができ次第、戻って試験実施、ってコトで。
(define expt-machine (make-machine '(b n continue val) (list (list '- -) (list '* *) (list '= =)) '(controller (assign continue (label expt-done)) expt-loop (test (op =) (reg n) (const 0)) (branch (label base-case)) (save continue) (save n) (assign n (op -) (reg n) (const 1)) (assign continue (label after-expt)) (goto (label expt-loop)) after-expt (restore n) (restore continue) (assign val (op *) (reg b) (reg val)) (goto (reg continue)) base-case (assign val (const 1)) (goto (reg continue)) expt-done)))
controller って不要なのだろうか。多分要らんのだろうな。
(set-register-contents! expt-machine 'b 2) done (set-register-contents! expt-machine 'n 5) done (start expt-machine) done (get-register-contents expt-machine 'val) 32
ってカンジになるんだろうか。あるいは b. なソレだと以下ですか。
(define expt-machine (make-machine '(b n c p) (list (list '= =) (list '- -) (list '* *)) '((assign c (reg n)) (assign p (const 1)) test-b (test (op =) (reg c) (const 0)) (branch (label expt-done)) (assign c (op -) (reg c) (const 1)) (assign p (op *) (reg b) (reg p)) (goto (label test-b)) expt-done)))
で、こんなカンジ??
# count とかヤッてる (修正済み
(set-register-contents! expt-machine 'b 2) done (set-register-contents! expt-machine 'n 5) done (start expt-machine) done (get-register-contents expt-machine 'p) 32
うーん。とりあえず assemble 以降に目を通してみます。