REPL

GUI版のmoshを作るに当たって、REPLを自前で実装する必要が出てきた。
REPLを実現するためにはread-eval-printの各手続きを実現する必要がある。
幸い、moshには備え付けのREPLがあるのでそれと同じ事をすれば良い。

(import (mosh) (rnrs))

(define eval-r6rs (symbol-value 'eval-r6rs))
(define (read-)
  (get-line (current-input-port)))
(define (eval- text)
  (eval-r6rs (call-with-port (open-string-input-port text) read)))
(define (print- obj)
  (display obj)(newline))

(define (repl)
  (display "> ")
  (print- (eval- (read-)))
  (repl))

(repl)

このスクリプトは例外を処理していないので、間違ったコードを入力すると直ぐに終了してしまう。
symbol-valueは(mosh)にある、mosh内部のシンボルにアクセスするための手続き。