開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- MIT/GNU Scheme (処理系)
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の5(レジスタ計算機での計算)、5.5(翻訳系)、翻訳系の概観、5.5.5(翻訳したコードの例)、問題 5.35.を解いてみる。
その他参考書籍
問題 5.35.
コード(BBEdit)
sample.scm
(define (f x) (+ x (g (+ x 2))))
確認のために、この公式を翻訳して図5.18に示すコードと一致するか確認。
翻訳。
(assign val (op make-compiled-procedure) (goto (label after-lambda1)) entry2 ;; fの呼び出しはここから (assign env (op compiled-procedure-env) (reg proc)) (assign env (op extend-environment) (reg env)) ;; (+ x (g (+ x 2)))の計算 (assign proc (op lookup-variable-value) (const +) (reg env)) (save continue) (save proc) (save env) ;; (g (+ x 2))の計算 (assign proc (op lookup-variable-value) (const g) (reg env)) (save proc) ;; (+ x 2)の計算 (assign proc (op lookup-variable-value) (const +) (reg env)) (assign val (const 2)) (assign argl (op list) (reg val)) (assign val (op lookup-variable-value) (const x) (reg env)) (assign argl (op cons) (reg val) (reg argl)) (test (op primitive-procedure?) (reg proc)) (branch (label primitive-branch11)) compiled-branch10 (assign continue (label after-call9)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch11 (assign val (op apply-primitive-procedure) (reg proc) (reg val)) after-call9 ;; valには(+ x 2)の結果がある (assign argl (op list) (reg val)) (restore proc) (test (op primitive-procedure?) (const g) (reg env)) (branch (label primitive-branch8)) compiled-branch7 (assign continue (label after-call6)) (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch8 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) after-call6 ;; valには(g (+ x 2))の結果がある (assign argl (op list) (reg val)) (restore env) (assign val (op lookup-variable-value) (const x) (reg env)) (assign argl (op cons) (reg val) (reg argl)) (restore proc) (test (op primitive-procedure?) (reg proc)) (branch (op primitive-branch5)) compiled-branch4 (assign val (op compiled-procedure-entry) (reg proc)) (goto (reg val)) primitive-branch5 (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) (goto (reg continue)) after-call3 ;; valには(+ x (g (+ x 2)))の結果がある after-lambda1 (perform (op define-variable!) (const f) (reg val) (reg env)) (assign val (const ok))
0 コメント:
コメントを投稿