EoPL reading (140) 3.2 The Front End
早朝練習。
Exercise 3.4
REPL を使うのは手動で以下。
$ gosh gosh> (add-load-path ".") ("." "/usr/share/gauche/site/lib" "/usr/share/gauche/0.8.13/lib") gosh> (load "parse-program") #t gosh> (load "Fig3.2") define-datatype.scm version J3 2002-01-02 10:55 define-datatype.scm version J3 2002-01-02 10:55 #t gosh> (define read-eval-print (lambda () (begin (display "--> ") (write (eval-program (parse-program (read)))) (newline) (read-eval-print)))) gosh> (read-eval-print) 5 --> 5 (add1 2) --> 3 (+ (add1 2) (- 6 4)) --> 5
何でこうなるのか。SICP 参考にしてみるとこうなら OK ?
gosh> (define read-eval-print (lambda () (begin (display "--> ") (let ((input (read))) (write (eval-program (parse-program (input)))) (newline) (read-eval-print)))))
駄目だな。こうか。
gosh> (define read-eval-print (lambda () (display "--> ") (let ((input (read))) (let ((output (eval-program (parse-program (input))))) (write output) (newline) (read-eval-print)))))
ダメか。write がアレなのかなぁ。
(define read-eval-print (lambda () (display "--> ") (let ((input (read))) (let ((output (eval-program (parse-program (input))))) (display output) (newline) (read-eval-print)))))
うーんプロンプトが出ない。
(define input-prompt (lambda () (newline) (display "--> ") (newline))) (define read-eval-print (lambda () (input-prompt) (let ((input (read))) (let ((output (eval-program (parse-program (input))))) (newline) (display output) (newline))) (read-eval-print)))
違う。あ、newline かなぁ。newline でしたが上記ダウト。こっちか。
(define input-prompt (lambda () (newline) (write "--> "))) (define read-eval-print (lambda () (input-prompt) (let ((input (read))) (let ((output (eval-program (parse-program input)))) (newline) (display output) (newline))) (read-eval-print)))
これだと出ません。バッファが flush されるタイミングがナニらしい。面倒なので SICP 方式にします。
(define input-prompt ";;; eval input:") (define output-prompt ";;; eval value:") (define display-prompt (lambda (str) (newline) (display str) (newline))) (define read-eval-print (lambda () (display-prompt input-prompt) (let ((input (read))) (let ((output (eval-program (parse-program input)))) (display-prompt output-prompt) (print output))) (read-eval-print)))
これで動いた。newline しないとバッファが flush されんのか。
gosh> (read-eval-print) ;;; eval input: 5 ;;; eval value: 5 ;;; eval input: (add1 2) ;;; eval value: 3 ;;; eval input: (+ (add1 2) (- 6 4)) ;;; eval value: 5 ;;; eval input:
朝っぱらから微妙なハマり方。