2014-07-27 22:37:46 -04:00
|
|
|
(define-library (picrin repl)
|
|
|
|
(import (scheme base)
|
|
|
|
(scheme read)
|
|
|
|
(scheme write)
|
2014-08-30 12:00:13 -04:00
|
|
|
(scheme eval)
|
2014-08-30 12:41:12 -04:00
|
|
|
(picrin macro)
|
|
|
|
(picrin library))
|
|
|
|
|
2014-08-30 12:41:37 -04:00
|
|
|
;; FIXME picrin doesn't offer cond-expand for now, so we define a macro ourselves
|
2014-08-30 12:41:12 -04:00
|
|
|
(define-syntax define-readline
|
|
|
|
(er-macro-transformer
|
|
|
|
(lambda (form rename compare)
|
|
|
|
(if (member '(picrin readline) (libraries))
|
|
|
|
`(import (picrin readline)
|
|
|
|
(picrin readline history))
|
|
|
|
`(begin
|
|
|
|
(define (readline str)
|
|
|
|
(display str)
|
|
|
|
(read-line))
|
|
|
|
(define (add-history str)
|
|
|
|
#f))))))
|
|
|
|
|
|
|
|
(define-readline)
|
2014-07-27 22:37:46 -04:00
|
|
|
|
2014-08-30 11:36:20 -04:00
|
|
|
(define (repl)
|
2014-08-31 12:00:30 -04:00
|
|
|
(let loop ((buf ""))
|
|
|
|
(let ((line (readline (if (equal? buf "") "> " "* "))))
|
|
|
|
(if (eof-object? line)
|
|
|
|
(newline) ; exit
|
|
|
|
(let ((str (string-append buf line "\n")))
|
|
|
|
(add-history line)
|
|
|
|
(call/cc
|
|
|
|
(lambda (exit)
|
|
|
|
(with-exception-handler
|
|
|
|
(lambda (condition)
|
|
|
|
(unless (equal? (error-object-message condition) "unexpected EOF")
|
|
|
|
(display (error-object-message condition) (current-error-port))
|
|
|
|
(newline)
|
|
|
|
(set! str ""))
|
|
|
|
(exit))
|
|
|
|
(lambda ()
|
|
|
|
;; FIXME
|
|
|
|
;; non-local exception jump from inside call-with-port
|
|
|
|
;; fails with segv, though i don't know why...
|
|
|
|
(let ((port (open-input-string str)))
|
|
|
|
(let next ((expr (read port)))
|
|
|
|
(unless (eof-object? expr)
|
|
|
|
(write (eval expr '(picrin user)))
|
|
|
|
(newline)
|
|
|
|
(set! str "")
|
|
|
|
(next (read port))))
|
|
|
|
(close-port port))))))
|
|
|
|
(loop str))))))
|
2014-07-27 22:37:46 -04:00
|
|
|
|
|
|
|
(export repl))
|
2014-08-30 10:30:04 -04:00
|
|
|
|