adding more featureful repl module

This commit is contained in:
Alex Shinn 2010-07-13 07:54:29 +09:00
parent b5f29def78
commit 1b14ac40a6
2 changed files with 63 additions and 0 deletions

5
lib/chibi/repl.module Normal file
View file

@ -0,0 +1,5 @@
(define-module (chibi repl)
(export repl)
(import-immutable (scheme) (chibi process))
(include "repl.scm"))

58
lib/chibi/repl.scm Normal file
View file

@ -0,0 +1,58 @@
(define (run-repl module env)
(if module (display module))
(display "> ")
(flush-output)
(let lp ()
(let ((ch (peek-char)))
(cond ((eof-object? ch)
(exit 0))
((and (char? ch) (char-whitespace? ch))
(read-char)
(lp)))))
(cond
((eq? #\@ (peek-char))
(read-char)
(let ((sym (read)))
(if (not (symbol? sym))
(error "repl: invalid @ syntax: @" sym)
(case sym
((config)
(let ((res (eval (read) *config-env*)))
(cond
((not (eq? res (if #f #f)))
(write res)
(newline)))
(run-repl module env)))
((in)
(let ((mod (read)))
(if (or (not mod) (equal? mod '(scheme)))
(run-repl #f (interaction-environment))
(let ((env (eval `(module-env (load-module ',mod))
*config-env*)))
(run-repl mod env)))))
(else
(error "repl: unknown @ escape" sym))))))
(else
(let ((expr (read)))
(cond
((eof-object? expr)
(exit 0))
(else
(let ((res (eval expr env)))
(cond
((not (eq? res (if #f #f)))
(write res)
(newline)))
(run-repl module env))))))))
(define (repl)
(set-signal-action! signal/interrupt
(lambda (n info)
(newline)
(run-repl #f (interaction-environment))))
(current-exception-handler
(lambda (exn)
(print-exception exn (current-error-port))
(run-repl #f (interaction-environment))))
(run-repl #f (interaction-environment)))