2014年1月13日月曜日

開発環境

計算機プログラムの構造と解釈(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.7(翻訳したコードと評価器のインターフェース)、解釈と翻訳、問題 5.49.を解いてみる。

その他参考書籍

問題 5.49.

追加、修正箇所。

コード(BBEdit)

;; …
(define (get-register-machine) eceval)
;; …
(define eceval-operations
;; …
   (list 'compile compile)
   (list 'assemble assemble)
   (list 'statements statements)
   (list 'get-register-machine get-register-machine)))

(define eceval
  (make-machine
   '(exp env val proc argl continue unev compapp machine)
   eceval-operations
  '(
  (assign machine (op get-register-machine))
;; ループ
read-eval-print-loop
  (perform (op initialize-stack))
  (perform
   (op prompt-for-input) (const ";;; EC-Eval input:"))
  ;; 式を読み込む
  (assign exp (op read))
  (assign env (op get-global-environment))
  (assign continue (label print-result))
  (goto (label compile))
;; 翻訳
compile
  (assign exp (op compile) (reg exp) (const val) (const return))
  (goto (label assemble))
;; アセンブリ
assemble
  (assign exp (op statements) (reg exp))
  (assign val (op assemble) (reg exp) (reg machine))
  (goto (reg val))
;; 結果を印字
print-result
  (perform (op print-stack-statistics))
   (op announce-output) (const ";;; EC-Eval value:"))
  (perform (op user-print) (reg val))
  (goto (label read-eval-print-loop))
   )))

入出力結果(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 "./eceval.scm")

;Loading "./eceval.scm"... done
;Value: start-eceval

1 ]=> (start-eceval)


;;; EC-Eval input:
10

(total-pushes = 0 maximum-depth = 0)
;;; EC-Eval value:
10

;;; EC-Eval input:
(+ 1 2)

(total-pushes = 0 maximum-depth = 0)
;;; EC-Eval value:
3

;;; EC-Eval input:
(define (factorial n)
  (if (= n 1)
      1
      (* (factorial (- n 1)) n)))

(total-pushes = 0 maximum-depth = 0)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(factorial 10)

(total-pushes = 56 maximum-depth = 29)
;;; EC-Eval value:
3628800

;;; EC-Eval input:
(factorial 100)

(total-pushes = 596 maximum-depth = 299)
;;; EC-Eval value:
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

;;; EC-Eval input:
End of input stream reached.
Moriturus te saluto.
$

0 コメント:

コメントを投稿