diff --git a/ice-9/boot-9.scm b/ice-9/boot-9.scm index 927da3e46..a357a0802 100644 --- a/ice-9/boot-9.scm +++ b/ice-9/boot-9.scm @@ -2975,6 +2975,7 @@ module '(ice-9 q) '(make-q q-length))}." ;; Indeed, all references to global variables are memoized into such ;; variable objects. +;; FIXME: these don't work with the compiler (define-macro (@ mod-name var-name) (let ((var (module-variable (resolve-interface mod-name) var-name))) (if (not var) @@ -3337,6 +3338,8 @@ module '(ice-9 q) '(make-q q-length))}." ;; scmsigs.c scm_sigaction_for_thread), so the handlers setup here have ;; no effect. (let ((old-handlers #f) + (start-repl (module-ref (resolve-interface '(system repl repl)) + 'start-repl)) (signals (if (provided? 'posix) `((,SIGINT . "User interrupt") (,SIGFPE . "Arithmetic error") @@ -3371,7 +3374,7 @@ module '(ice-9 q) '(make-q q-length))}." ;; the protected thunk. (lambda () - (let ((status (scm-style-repl))) + (let ((status (start-repl 'scheme))) (run-hook exit-hook) status)) diff --git a/module/system/repl/repl.scm b/module/system/repl/repl.scm index 4ddacbe64..cf948c63e 100644 --- a/module/system/repl/repl.scm +++ b/module/system/repl/repl.scm @@ -102,7 +102,8 @@ expr))) (define (start-repl lang) - (let ((repl (make-repl lang))) + (let ((repl (make-repl lang)) + (status #f)) (repl-welcome repl) (let prompt-loop () (let ((exp (call-with-backtrace @@ -114,21 +115,28 @@ (lambda () (meta-command repl (read-line))))) ((eof-object? exp) - (throw 'quit)) + (newline) + (set! status '())) (else (call-with-backtrace (lambda () - (call-with-values (lambda () - (run-hook before-eval-hook exp) - (start-stack repl-eval - (repl-eval repl exp))) - (lambda l - (for-each (lambda (v) - (run-hook before-print-hook v) - (repl-print repl v)) - l))))))) - (next-char #f) ;; consume trailing whitespace - (prompt-loop))))) + (catch 'quit + (lambda () + (call-with-values (lambda () + (run-hook before-eval-hook exp) + (start-stack repl-eval + (repl-eval repl exp))) + (lambda l + (for-each (lambda (v) + (run-hook before-print-hook v) + (repl-print repl v)) + l)))) + (lambda (k . args) + (set! status args))))))) + (or status + (begin + (next-char #f) ;; consume trailing whitespace + (prompt-loop))))))) (define (next-char wait) (if (or wait (char-ready?))