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:

朝っぱらから微妙なハマり方。