SICP 読み (178) 4.1.7 構文解析を実行から分離する

今日三発目。

今まで gaunit に頼ってて driver-loop 手続きを全然使ってませんでした。組み込んでもいない始末。time くらいしか思いつかないんですが、Binary Hacks あたりにソレな道具があったりするかも、と思いつつ以下の手続きを仕込む。

(define input-prompt ";;; M-Eval input:")
(define output-prompt ";;; M-Eval value:")

(define (driver-loop)
  (prompt-for-input input-prompt)
  (let ((input (read)))
    (if (not (eof-object? input))
	(let ((output (eval input the-global-environment)))
	  (announce-output output-prompt)
	  (user-print output)
	  (driver-loop)))))


(define (prompt-for-input string)
  (newline) (newline) (display string) (newline))

(define (announce-output string)
  (newline) (display string) (newline))

(define (user-print object)
  (if (compound-procedure? object)
      (display (list 'compound-procedure
                     (procedure-parameters object)
                     (procedure-body object)
                     '<procedure-env>))
      (display object)))

(define the-global-environment (setup-environment))
(driver-loop)

the-global-environment の define は組み込んであったんですが、とりあえず以下の手続きをファイルに保管しておいて

(define (fib n)
  (cond ((= n 0) 0)
	((= n 1) 1)
	(else (+ (fib (- n 1))
		 (fib (- n 2))))))

(fib 8)

以下のコマンドにて動作。

$ time gosh ./4.1.4.scm <test1/test.scm 


;;; M-Eval input:

;;; M-Eval value:
ok

;;; M-Eval input:

;;; M-Eval value:
21

;;; M-Eval input:

real    0m0.979s
user    0m0.056s
sys     0m0.016s
$

微妙な出力が気になりますがスルー。(を
4.1.4 節なソレと 4.1.7 節なナニを用意しておいて比べてみれば良いのでしょうが、time の出力の意味を忘れています。(こら

とりあえず、analyze 版も同様なソレを準備したんで、実験仕様の設計を色々考えてみましょうね。