~ chicken-core (chicken-5) e1d4dea7aab29fe7c3a4b1c307f055e7512c8cae


commit e1d4dea7aab29fe7c3a4b1c307f055e7512c8cae
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Tue Jan 12 23:42:55 2016 +1300
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Tue Mar 8 22:52:33 2016 +1300

    Move repl and repl-prompt to new chicken.repl module
    
    Also, sort the library list in runtests.sh.

diff --git a/README b/README
index 53489fcd..3a1146bc 100644
--- a/README
+++ b/README
@@ -297,6 +297,7 @@
 	|   |       |-- chicken.irregex.import.so
 	|   |       |-- chicken.ports.import.so
 	|   |       |-- chicken.posix.import.so
+	|   |       |-- chicken.repl.import.so
 	|   |       |-- chicken.tcp.import.so
 	|   |       |-- chicken.utils.import.so
 	|   |       |-- csi.import.so
diff --git a/chicken-install.scm b/chicken-install.scm
index 41c03048..35302baf 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -57,6 +57,7 @@
       "chicken.lolevel.import.so"
       "chicken.ports.import.so"
       "chicken.posix.import.so"
+      "chicken.repl.import.so"
       "chicken.tcp.import.so"
       "chicken.utils.import.so"
       "csi.import.so"
diff --git a/chicken.import.scm b/chicken.import.scm
index 339e6fa5..39dad630 100644
--- a/chicken.import.scm
+++ b/chicken.import.scm
@@ -217,8 +217,6 @@
    register-feature!
    remprop!
    rename-file
-   (repl . chicken.eval#repl)
-   (repl-prompt . chicken.eval#repl-prompt)
    (repository-path . chicken.eval#repository-path)
    (require . chicken.eval#require)
    reset
diff --git a/core.scm b/core.scm
index 5faccf51..c45d324d 100644
--- a/core.scm
+++ b/core.scm
@@ -1404,7 +1404,7 @@
     (map (lambda (x) (walk x e se #f #f h ln)) xs) )
 
   (when (memq 'c debugging-chicken) (newline) (pretty-print exp))
-  (##sys#clear-trace-buffer)
+  (foreign-code "C_clear_trace_buffer();")
   ;; Process visited definitions and main expression:
   (walk
    `(##core#begin
diff --git a/csi.scm b/csi.scm
index fd815d86..a240fe4c 100644
--- a/csi.scm
+++ b/csi.scm
@@ -26,7 +26,7 @@
 
 
 (declare
-  (uses data-structures eval expand extras ports)
+  (uses data-structures eval expand extras ports repl)
   (usual-integrations)
   (disable-interrupts)
   (compile-syntax)
@@ -56,7 +56,8 @@ EOF
 
 (import chicken.data-structures
 	chicken.extras
-	chicken.ports)
+	chicken.ports
+	chicken.repl)
 
 
 ;;; Parameters:
diff --git a/defaults.make b/defaults.make
index d771c8fc..41a5212d 100644
--- a/defaults.make
+++ b/defaults.make
@@ -265,8 +265,8 @@ CHICKEN_PROGRAM_OPTIONS += $(if $(PROFILE_OBJECTS),-profile)
 PRIMITIVE_IMPORT_LIBRARIES = chicken csi chicken.foreign
 POSIX_IMPORT_LIBRARY = chicken.posix
 DYNAMIC_IMPORT_LIBRARIES = setup-api setup-download srfi-4
-DYNAMIC_CHICKEN_IMPORT_LIBRARIES = data-structures eval expand extras \
-	files internal irregex lolevel ports tcp utils
+DYNAMIC_CHICKEN_IMPORT_LIBRARIES = data-structures eval repl expand \
+	extras files internal irregex lolevel ports tcp utils
 
 # targets
 
diff --git a/distribution/manifest b/distribution/manifest
index 0160f893..d3cd94c5 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -40,6 +40,7 @@ srfi-4.c
 stub.c
 support.c
 chicken.compiler.support.import.scm
+repl.c
 tcp.c
 utils.c
 feathers.in
@@ -88,6 +89,7 @@ posixunix.scm
 posixwin.scm
 posix-common.scm
 profiler.scm
+repl.scm
 runtime.c
 scheduler.scm
 srfi-4.scm
@@ -262,6 +264,8 @@ chicken.ports.import.scm
 chicken.ports.import.c
 chicken.posix.import.scm
 chicken.posix.import.c
+chicken.repl.import.scm
+chicken.repl.import.c
 chicken.tcp.import.scm
 chicken.tcp.import.c
 chicken.utils.import.scm
@@ -340,6 +344,7 @@ manual-html/Unit lolevel.html
 manual-html/Unit ports.html
 manual-html/Unit posix.html
 manual-html/Unit irregex.html
+manual-html/Unit repl.html
 manual-html/Unit srfi-4.html
 manual-html/Unit tcp.html
 manual-html/Unit utils.html
diff --git a/eval.scm b/eval.scm
index ca1dbe79..a9b090ad 100644
--- a/eval.scm
+++ b/eval.scm
@@ -28,9 +28,7 @@
 (declare
   (unit eval)
   (uses expand internal modules)
-  (not inline ##sys#repl-read-hook ##sys#repl-print-hook 
-       ##sys#read-prompt-hook ##sys#alias-global-hook ##sys#user-read-hook
-       ##sys#syntax-error-hook))
+  (not inline ##sys#alias-global-hook ##sys#user-read-hook ##sys#syntax-error-hook))
 
 #>
 #ifndef C_INSTALL_EGG_HOME
@@ -53,7 +51,7 @@
    eval eval-handler extension-information
    load load-library load-noisily load-relative load-verbose
    interaction-environment null-environment scheme-report-environment
-   repl repl-prompt require repository-path set-dynamic-load-mode!)
+   require repository-path set-dynamic-load-mode!)
 
 ;; Exclude values defined within this module.
 (import (except scheme eval load interaction-environment null-environment scheme-report-environment))
@@ -88,6 +86,7 @@
     (chicken.ports . ports)
     (chicken.posix . posix)
     (chicken.tcp . tcp)
+    (chicken.repl . repl)
     (chicken.utils . utils)))
 
 (define-constant core-library-units
@@ -1385,7 +1384,7 @@
 	 (##sys#error
 	  'null-environment 
 	  "unsupported null environment version" n) )))))
-            
+
 
 ;;; Find included file:
 
@@ -1427,150 +1426,6 @@
 		  (else (loop (##sys#slot paths 1))) ) ) ) ) ) )
 
 
-;;;; Read-Eval-Print loop:
-
-(define ##sys#repl-print-length-limit #f)
-(define ##sys#repl-read-hook #f)
-(define ##sys#repl-recent-call-chain #f) ; used in csi for ,c command
-
-(define (##sys#repl-print-hook x port)
-  (##sys#with-print-length-limit ##sys#repl-print-length-limit (cut ##sys#print x #t port))
-  (##sys#write-char-0 #\newline port) )
-
-(define repl-prompt (make-parameter (lambda () "#;> ")))
-
-(define ##sys#read-prompt-hook
-  (let ([repl-prompt repl-prompt])
-    (lambda () 
-      (##sys#print ((repl-prompt)) #f ##sys#standard-output)
-      (##sys#flush-output ##sys#standard-output) ) ) )
-
-(define ##sys#clear-trace-buffer (foreign-lambda void "C_clear_trace_buffer"))
-(define (##sys#resize-trace-buffer i)
-  (##sys#check-fixnum i)
-  (##core#inline "C_resize_trace_buffer" i))
-
-(define repl
-  (let ((eval eval)
-	(read read)
-	(call-with-current-continuation call-with-current-continuation)
-	(string-append string-append))
-    (lambda (#!optional (evaluator eval))
-
-      (define (write-err xs)
-	(for-each (cut ##sys#repl-print-hook <> ##sys#standard-error) xs) )
-
-      (define (write-results xs)
-	(cond ((null? xs)
-	       (##sys#print "; no values\n" #f ##sys#standard-output))
-	      ((not (eq? (##core#undefined) (car xs)))
-	       (for-each (cut ##sys#repl-print-hook <> ##sys#standard-output) xs)
-	       (when (pair? (cdr xs))
-		 (##sys#print 
-		  (string-append "; " (##sys#number->string (length xs)) " values\n")
-		  #f ##sys#standard-output)))))
-
-      (let ((stdin ##sys#standard-input)
-	    (stdout ##sys#standard-output)
-	    (stderr ##sys#standard-error)
-	    (ehandler (##sys#error-handler))
-	    (rhandler (##sys#reset-handler)) 
-	    (lv #f)
-	    (qh ##sys#quit-hook)
-	    (uie ##sys#unbound-in-eval) )
-
-	(define (saveports)
-	  (set! stdin ##sys#standard-input)
-	  (set! stdout ##sys#standard-output)
-	  (set! stderr ##sys#standard-error) )
-
-	(define (resetports)
-	  (set! ##sys#standard-input stdin)
-	  (set! ##sys#standard-output stdout)
-	  (set! ##sys#standard-error stderr) )
-
-	(call-with-current-continuation
-	 (lambda (k)
-	   (##sys#dynamic-wind
-	    (lambda ()
-	      (set! lv (load-verbose))
-	      (set! ##sys#quit-hook (lambda (result) (k result)))
-	      (load-verbose #t)
-	      (##sys#error-handler
-	       (lambda (msg . args)
-		 (resetports)
-		 (##sys#print "\nError" #f ##sys#standard-error)
-		 (when msg
-		   (##sys#print ": " #f ##sys#standard-error)
-		   (##sys#print msg #f ##sys#standard-error) )
-		 (if (and (pair? args) (null? (cdr args)))
-		     (begin
-		       (##sys#print ": " #f ##sys#standard-error)
-		       (write-err args) )
-		     (begin
-		       (##sys#write-char-0 #\newline ##sys#standard-error)
-		       (write-err args) ) )
-		 (set! ##sys#repl-recent-call-chain
-		   (or (and-let* ((lexn ##sys#last-exception) ;XXX not really right
-				  ((##sys#structure? lexn 'condition))
-				  (a (member '(exn . call-chain) (##sys#slot lexn 2))))
-			 (let ((ct (cadr a)))
-			   (##sys#really-print-call-chain
-			    ##sys#standard-error ct
-			    "\n\tCall history:\n")
-			   ct))
-		       (print-call-chain ##sys#standard-error)))
-		 (flush-output ##sys#standard-error) ) ) )
-	    (lambda ()
-	      (let loop ()
-		(saveports)
-		(call-with-current-continuation
-		 (lambda (c)
-		   (##sys#reset-handler
-		    (lambda ()
-		      (set! ##sys#read-error-with-line-number #f)
-		      (set! ##sys#enable-qualifiers #t)
-		      (resetports)
-		      (c #f) ) ) ) )
-		(##sys#read-prompt-hook)
-		(let ([exp ((or ##sys#repl-read-hook read))])
-		  (unless (eof-object? exp)
-		    (when (eq? #\newline (##sys#peek-char-0 ##sys#standard-input))
-		      (##sys#read-char-0 ##sys#standard-input) )
-		    (##sys#clear-trace-buffer)
-		    (set! ##sys#unbound-in-eval '())
-		    (receive result (evaluator exp)
-		      (when (and ##sys#warnings-enabled (pair? ##sys#unbound-in-eval))
-			(let loop ((vars ##sys#unbound-in-eval) (u '()))
-			  (cond ((null? vars)
-				 (when (pair? u)
-				   (##sys#notice
-				    "the following toplevel variables are referenced but unbound:\n")
-				   (for-each 
-				    (lambda (v)
-				      (##sys#print "  " #f ##sys#standard-error)
-				      (##sys#print (car v) #t ##sys#standard-error)
-				      (when (cdr v)
-					(##sys#print " (in " #f ##sys#standard-error)
-					(##sys#print (cdr v) #t ##sys#standard-error) 
-					(##sys#write-char-0 #\) ##sys#standard-error) )
-				      (##sys#write-char-0 #\newline ##sys#standard-error) )
-				    u)
-				   (##sys#flush-output ##sys#standard-error)))
-				((or (memq (caar vars) u) 
-				     (##sys#symbol-has-toplevel-binding? (caar vars)) )
-				 (loop (cdr vars) u) )
-				(else (loop (cdr vars) (cons (car vars) u))) ) 9 ) )
-		      (write-results result) 
-		      (loop) ) ) ) ) )
-	    (lambda ()
-	      (load-verbose lv)
-	      (set! ##sys#quit-hook qh)
-	      (set! ##sys#unbound-in-eval uie)
-	      (##sys#error-handler ehandler)
-	      (##sys#reset-handler rhandler) ) ) ) ) ) ) ))
-
-
 ;;; SRFI-10:
 
 (define sharp-comma-reader-ctors (make-vector 301 '()))
diff --git a/library.scm b/library.scm
index 643d0d47..2f35b7af 100644
--- a/library.scm
+++ b/library.scm
@@ -4637,8 +4637,8 @@ EOF
 		      args) ] )
 	      (##sys#print #\newline #f ##sys#standard-error)
 	      (print-call-chain ##sys#standard-error)
-	      (when (and ##sys#break-on-error (##sys#symbol-has-toplevel-binding? 'repl))
-		(repl) 
+	      (when (and ##sys#break-on-error (##sys#symbol-has-toplevel-binding? 'chicken.repl#repl))
+		(chicken.repl#repl)
 		(##sys#print #\newline #f ##sys#standard-error)
 		(##core#inline "C_exit_runtime" _ex_software) )
 	      (##core#inline "C_halt" #f) )
diff --git a/manual/Supported language b/manual/Supported language
index fd98439d..0c5eadfe 100644
--- a/manual/Supported language	
+++ b/manual/Supported language	
@@ -15,6 +15,7 @@
 * [[Exceptions]]
 * [[Unit library]] Basic Scheme definitions
 * [[Unit eval]] Evaluation
+* [[Unit repl]] Read-print-eval loop
 * [[Unit expand]] Modules and macros handling
 * [[Unit data-structures]] Data structures
 * [[Unit ports]] I/O ports
diff --git a/manual/Unit eval b/manual/Unit eval
index e61a3f95..4b61e775 100644
--- a/manual/Unit eval	
+++ b/manual/Unit eval	
@@ -182,4 +182,4 @@ before calling {{eval}}.
 ---
 Previous: [[Unit library]]
 
-Next: [[Unit expand]]
+Next: [[Unit repl]]
diff --git a/manual/Unit repl b/manual/Unit repl
new file mode 100644
index 00000000..19bd50de
--- /dev/null
+++ b/manual/Unit repl	
@@ -0,0 +1,27 @@
+[[tags: manual]]
+[[toc:]]
+
+== Unit repl
+
+This unit provides CHICKEN's read-print-eval loop.
+
+
+=== repl
+
+<procedure>(repl [EVALUATOR])</procedure>
+
+Start a new read-eval-print loop. Sets the {{reset-handler}} so that
+any invocation of {{reset}} restarts the read-eval-print loop. Also
+changes the current exception-handler to display a message, write
+any arguments to the value of {{(current-error-port)}} and reset.
+
+If {{EVALUATOR}} is given, it should be a procedure of one argument that
+is used in place of {{eval}} to evaluate each entered expression.
+
+You can use {{quit}} to terminate the current read-eval-print loop.
+
+
+---
+Previous: [[Unit eval]]
+
+Next: [[Unit expand]]
diff --git a/modules.scm b/modules.scm
index 1bdbaf48..9f906453 100644
--- a/modules.scm
+++ b/modules.scm
@@ -940,6 +940,7 @@
 (##sys#register-module-alias 'lolevel 'chicken.lolevel)
 (##sys#register-module-alias 'ports 'chicken.ports)
 (##sys#register-module-alias 'posix 'chicken.posix)
+(##sys#register-module-alias 'repl 'chicken.repl)
 (##sys#register-module-alias 'tcp 'chicken.tcp)
 (##sys#register-module-alias 'utils 'chicken.utils)
 
diff --git a/repl.scm b/repl.scm
new file mode 100644
index 00000000..393ea0ab
--- /dev/null
+++ b/repl.scm
@@ -0,0 +1,182 @@
+;;;; repl.scm - CHICKEN's read/eval/print loop
+;
+; Copyright (c) 2008-2016, The CHICKEN Team
+; Copyright (c) 2000-2007, Felix L. Winkelmann
+; All rights reserved.
+;
+; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
+; conditions are met:
+;
+;   Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+;     disclaimer.
+;   Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+;     disclaimer in the documentation and/or other materials provided with the distribution.
+;   Neither the name of the author nor the names of its contributors may be used to endorse or promote
+;     products derived from this software without specific prior written permission.
+;
+; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+; POSSIBILITY OF SUCH DAMAGE.
+
+(declare
+  (unit repl)
+  (uses eval)
+  (not inline ##sys#repl-read-hook ##sys#repl-print-hook ##sys#read-prompt-hook))
+
+(module chicken.repl
+  (repl repl-prompt)
+
+(import scheme
+	chicken
+	chicken.eval
+	chicken.foreign)
+
+(include "common-declarations.scm")
+
+(define ##sys#repl-print-length-limit #f)
+(define ##sys#repl-read-hook #f)
+(define ##sys#repl-recent-call-chain #f) ; used in csi for ,c command
+
+(define (##sys#repl-print-hook x port)
+  (##sys#with-print-length-limit ##sys#repl-print-length-limit (cut ##sys#print x #t port))
+  (##sys#write-char-0 #\newline port))
+
+(define repl-prompt
+  (make-parameter (lambda () "#;> ")))
+
+(define ##sys#read-prompt-hook
+  (let ((repl-prompt repl-prompt))
+    (lambda ()
+      (##sys#print ((repl-prompt)) #f ##sys#standard-output)
+      (##sys#flush-output ##sys#standard-output))))
+
+(define (##sys#resize-trace-buffer i)
+  (##sys#check-fixnum i)
+  (##core#inline "C_resize_trace_buffer" i))
+
+(define repl
+  (let ((eval eval)
+	(read read)
+	(call-with-current-continuation call-with-current-continuation)
+	(string-append string-append))
+    (lambda (#!optional (evaluator eval))
+
+      (define (write-err xs)
+	(for-each (cut ##sys#repl-print-hook <> ##sys#standard-error) xs))
+
+      (define (write-results xs)
+	(cond ((null? xs)
+	       (##sys#print "; no values\n" #f ##sys#standard-output))
+	      ((not (eq? (##core#undefined) (car xs)))
+	       (for-each (cut ##sys#repl-print-hook <> ##sys#standard-output) xs)
+	       (when (pair? (cdr xs))
+		 (##sys#print
+		  (string-append "; " (##sys#number->string (length xs)) " values\n")
+		  #f ##sys#standard-output)))))
+
+      (let ((stdin ##sys#standard-input)
+	    (stdout ##sys#standard-output)
+	    (stderr ##sys#standard-error)
+	    (ehandler (##sys#error-handler))
+	    (rhandler (##sys#reset-handler))
+	    (lv #f)
+	    (qh ##sys#quit-hook)
+	    (uie ##sys#unbound-in-eval))
+
+	(define (saveports)
+	  (set! stdin ##sys#standard-input)
+	  (set! stdout ##sys#standard-output)
+	  (set! stderr ##sys#standard-error))
+
+	(define (resetports)
+	  (set! ##sys#standard-input stdin)
+	  (set! ##sys#standard-output stdout)
+	  (set! ##sys#standard-error stderr))
+
+	(call-with-current-continuation
+	 (lambda (k)
+	   (##sys#dynamic-wind
+	    (lambda ()
+	      (set! lv (load-verbose))
+	      (set! ##sys#quit-hook (lambda (result) (k result)))
+	      (load-verbose #t)
+	      (##sys#error-handler
+	       (lambda (msg . args)
+		 (resetports)
+		 (##sys#print "\nError" #f ##sys#standard-error)
+		 (when msg
+		   (##sys#print ": " #f ##sys#standard-error)
+		   (##sys#print msg #f ##sys#standard-error))
+		 (if (and (pair? args) (null? (cdr args)))
+		     (begin
+		       (##sys#print ": " #f ##sys#standard-error)
+		       (write-err args))
+		     (begin
+		       (##sys#write-char-0 #\newline ##sys#standard-error)
+		       (write-err args)))
+		 (set! ##sys#repl-recent-call-chain
+		   (or (and-let* ((lexn ##sys#last-exception) ;XXX not really right
+				  ((##sys#structure? lexn 'condition))
+				  (a (member '(exn . call-chain) (##sys#slot lexn 2))))
+			 (let ((ct (cadr a)))
+			   (##sys#really-print-call-chain
+			    ##sys#standard-error ct
+			    "\n\tCall history:\n")
+			   ct))
+		       (print-call-chain ##sys#standard-error)))
+		 (flush-output ##sys#standard-error))))
+	    (lambda ()
+	      (let loop ()
+		(saveports)
+		(call-with-current-continuation
+		 (lambda (c)
+		   (##sys#reset-handler
+		    (lambda ()
+		      (set! ##sys#read-error-with-line-number #f)
+		      (set! ##sys#enable-qualifiers #t)
+		      (resetports)
+		      (c #f)))))
+		(##sys#read-prompt-hook)
+		(let ((exp ((or ##sys#repl-read-hook read))))
+		  (unless (eof-object? exp)
+		    (when (eq? #\newline (##sys#peek-char-0 ##sys#standard-input))
+		      (##sys#read-char-0 ##sys#standard-input))
+		    (foreign-code "C_clear_trace_buffer();")
+		    (set! ##sys#unbound-in-eval '())
+		    (receive result (evaluator exp)
+		      (when (and ##sys#warnings-enabled (pair? ##sys#unbound-in-eval))
+			(let loop ((vars ##sys#unbound-in-eval)
+				   (u '()))
+			  (cond ((null? vars)
+				 (when (pair? u)
+				   (##sys#notice
+				    "the following toplevel variables are referenced but unbound:\n")
+				   (for-each
+				    (lambda (v)
+				      (##sys#print "  " #f ##sys#standard-error)
+				      (##sys#print (car v) #t ##sys#standard-error)
+				      (when (cdr v)
+					(##sys#print " (in " #f ##sys#standard-error)
+					(##sys#print (cdr v) #t ##sys#standard-error)
+					(##sys#write-char-0 #\) ##sys#standard-error))
+				      (##sys#write-char-0 #\newline ##sys#standard-error))
+				    u)
+				   (##sys#flush-output ##sys#standard-error)))
+				((or (memq (caar vars) u)
+				     (##sys#symbol-has-toplevel-binding? (caar vars)))
+				 (loop (cdr vars) u))
+				(else (loop (cdr vars) (cons (car vars) u)))) 9))
+		      (write-results result)
+		      (loop))))))
+	    (lambda ()
+	      (load-verbose lv)
+	      (set! ##sys#quit-hook qh)
+	      (set! ##sys#unbound-in-eval uie)
+	      (##sys#error-handler ehandler)
+	      (##sys#reset-handler rhandler))))))))))
diff --git a/rules.make b/rules.make
index 3a0e08d8..ad8b8d02 100644
--- a/rules.make
+++ b/rules.make
@@ -36,7 +36,7 @@ VPATH=$(SRCDIR)
 SETUP_API_OBJECTS_1 = setup-api setup-download
 
 LIBCHICKEN_SCHEME_OBJECTS_1 = \
-       library eval data-structures ports files extras lolevel utils tcp srfi-4 \
+       library eval repl data-structures ports files extras lolevel utils tcp srfi-4 \
        $(POSIXFILE) internal irregex scheduler debugger-client \
        profiler stub expand modules chicken-syntax chicken-ffi-syntax build-version
 LIBCHICKEN_OBJECTS_1 = $(LIBCHICKEN_SCHEME_OBJECTS_1) runtime
@@ -677,6 +677,8 @@ eval.c: eval.scm \
 		chicken.expand.import.scm \
 		chicken.foreign.import.scm \
 		chicken.internal.import.scm
+repl.c: repl.scm \
+		chicken.eval.import.scm
 files.c: files.scm \
 		chicken.data-structures.import.scm \
 		chicken.extras.import.scm \
@@ -709,6 +711,8 @@ internal.c: $(SRCDIR)internal.scm $(SRCDIR)mini-srfi-1.scm
 	$(bootstrap-lib) -emit-import-library chicken.internal
 eval.c: $(SRCDIR)eval.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm
 	$(bootstrap-lib) -emit-import-library chicken.eval
+repl.c: $(SRCDIR)repl.scm $(SRCDIR)common-declarations.scm
+	$(bootstrap-lib) -emit-import-library chicken.repl
 expand.c: $(SRCDIR)expand.scm $(SRCDIR)synrules.scm $(SRCDIR)common-declarations.scm
 	$(bootstrap-lib) -emit-import-library chicken.expand
 modules.c: $(SRCDIR)modules.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 84fa95aa..4756fafe 100755
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -35,18 +35,24 @@ mkdir -p test-repository
 
 # copy files into test-repository (by hand to avoid calling `chicken-install'):
 
-for x in setup-api.so setup-api.import.so setup-download.so \
-      setup-download.import.so chicken.import.so chicken.lolevel.import.so \
-      srfi-4.import.so chicken.data-structures.import.so \
-      chicken.ports.import.so chicken.utils.import.so chicken.files.import.so \
-      chicken.posix.import.so \
-      chicken.extras.import.so \
-      chicken.internal.import.so \
-      chicken.irregex.import.so \
-      chicken.tcp.import.so \
-      chicken.foreign.import.so \
-      csi.import.so types.db; do
-  cp ../$x test-repository
+for x in \
+    chicken.import.so csi.import.so types.db \
+    setup-api.so setup-api.import.so srfi-4.import.so \
+    setup-download.so setup-download.import.so \
+    chicken.data-structures.import.so \
+    chicken.extras.import.so \
+    chicken.files.import.so \
+    chicken.foreign.import.so \
+    chicken.internal.import.so \
+    chicken.irregex.import.so \
+    chicken.lolevel.import.so \
+    chicken.ports.import.so \
+    chicken.posix.import.so \
+    chicken.repl.import.so \
+    chicken.tcp.import.so \
+    chicken.utils.import.so
+do
+    cp ../$x test-repository
 done
 
 CHICKEN_REPOSITORY=${TEST_DIR}/test-repository
diff --git a/types.db b/types.db
index c8accdc3..dad70c1b 100644
--- a/types.db
+++ b/types.db
@@ -1236,8 +1236,6 @@
 (register-feature! (#(procedure #:clean #:enforce) register-feature! (#!rest symbol) undefined))
 (remprop! (#(procedure #:clean #:enforce) remprop! (symbol symbol) undefined))
 (rename-file (#(procedure #:clean #:enforce) rename-file (string string) string))
-(chicken.eval#repl (#(procedure #:enforce) chicken.eval#repl (#!optional (procedure (*) . *)) undefined))
-(chicken.eval#repl-prompt (#(procedure #:clean #:enforce) chicken.eval#repl-prompt (#!optional (procedure () string)) procedure))
 (chicken.eval#repository-path (#(procedure #:clean) chicken.eval#repository-path (#!optional *) *))
 (chicken.eval#require (#(procedure #:clean) chicken.eval#require (#!rest (or string symbol)) undefined))
 (reset (procedure reset () noreturn))
@@ -1247,6 +1245,9 @@
 (set-finalizer! (#(procedure #:clean #:enforce) set-finalizer! (* (procedure (*) . *)) *))
 (set-gc-report! (#(procedure #:clean) set-gc-report! (*) undefined))
 
+(chicken.repl#repl (#(procedure #:enforce) chicken.repl#repl (#!optional (procedure (*) . *)) undefined))
+(chicken.repl#repl-prompt (#(procedure #:clean #:enforce) chicken.repl#repl-prompt (#!optional (procedure () string)) procedure))
+
 (set-parameterized-read-syntax!
  (#(procedure #:clean #:enforce) set-parameterized-read-syntax!
   (char (or false (procedure (input-port fixnum) . *)))
Trap