2013年12月18日水曜日

開発環境

計算機プログラムの構造と解釈(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 コメント:

コメントを投稿