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 版も同様なソレを準備したんで、実験仕様の設計を色々考えてみましょうね。