開発環境
- 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.1(翻訳系の構造)、標的と接続、命令列とスタックの使用、問題 5.32-a.を解いてみる。
その他参考書籍
問題 5.32-a.
修正、追加箇所。
コード(BBEdit)
eceval.scm
ev-application (save continue) (assign unev (op operands) (reg exp)) (assign exp (op operator) (reg exp)) ;; 記号ではないかどうかテスト (test (op variable?) (reg exp)) (branch (label appl-did-operator-variable)) (save unev) (assign continue (label appl-did-operator-symbol)) (goto (label eval-dispatch)) ;; 記号ではなかった場合 ev-operator-variable ;; 今まで通り (save env) (save unev) (assign continue (label ev-appl-did-variable)) (goto (label eval-dispatch)) ;; 記号だった場合 ev-operator-symbol ;; レジスタenvは退避させる必要ない (save unev) (assign continue (label ev-appl-did-symbol)) (goto (label eval-dispatch)) ;; 記号ではなかった場合 ev-appl-did-operator-variable ;; 今まで通り (restore unev) (restore env) (goto (label ev-did-operator)) ;; 記号だった場合 ev-appl-did-operator-symbol ;; 回復させる必要があるのはレジスタunevのみ (restore unev) (goto (label ev-did-operator)) ev-appl-did-operator (assign argl (op empty-arglist)) (assign proc (reg val)) (test (op no-operands?) (reg unev)) (branch (label apply-dispatch)) (save proc) ev-application (save continue) (assign unev (op operands) (reg exp)) (assign exp (op operator) (reg exp)) ;; 記号ではないかどうかテスト (test (op variable?) (reg exp)) (branch (label ev-appl-did-operator-variable)) ;; 記号だった場合 ;; レジスタenvは退避させる必要ない (save unev) (assign continue (label ev-appl-did-operator-symbol)) (goto (label eval-dispatch)) ;; 記号ではなかった場合 ev-operator-variable ;; 今まで通り (save env) (save unev) (assign continue (label ev-appl-did-variable)) (goto (label eval-dispatch)) ;; 記号ではなかった場合 ev-appl-did-operator-variable ;; 今まで通り (restore unev) (restore env) (goto (label ev-appl-did-operator)) ;; 記号だった場合 ev-appl-did-operator-symbol ;; 回復させる必要があるのはレジスタunevのみ (restore unev) (goto (label ev-appl-did-operator)) ev-appl-did-operator ;; 記号かどうかによって回復するレジスタが異なり、既に回復済なのでここでの回復を除去 (assign argl (op empty-arglist)) (assign proc (reg val)) (test (op no-operands?) (reg unev)) (branch (label apply-dispatch)) (save proc)
動くことを確認。
コード(BBEdit)
sample.scm
(load "./eval.scm") (load "./register.scm") (load "./eceval.scm") (start eceval)
入出力結果(Terminal, REPL(Read, Eval, Print, Loop))
$ scheme MIT/GNU Scheme running under MacOSX Type `^C' (control-C) followed by `H' to obtain information about interrupts. Copyright (C) 2011 Massachusetts Institute of Technology This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Image saved on Saturday October 26, 2013 at 11:02:50 PM Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/C 4.118 Edwin 3.116 1 ]=> (load "./sample.scm") ;Loading "./sample.scm"... ; Loading "eval.scm"... done ; Loading "register.scm"... ; Loading "eceval.scm"... done ;;; EC-Eval input: End of input stream reached. Moriturus te saluto. $
0 コメント:
コメントを投稿