~ chicken-core (chicken-5) 4e8ef70c5edeb6d4d0d81923842a57300bab253c


commit 4e8ef70c5edeb6d4d0d81923842a57300bab253c
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Jul 18 00:28:41 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jul 18 00:28:41 2011 +0200

    added quit, q csi command invokes quit

diff --git a/csi.scm b/csi.scm
index bdaa518a..06708607 100644
--- a/csi.scm
+++ b/csi.scm
@@ -130,7 +130,7 @@ EOF
 
 (define (print-banner)
   (newline)
-  ;;UNUSED
+  ;;UNUSED BECAUSE IT IS STUPID
   #;(when (and (tty-input?) (##sys#fudge 11))
     (let* ((t (string-copy +product+))
 	   (len (string-length t))
@@ -336,7 +336,7 @@ EOF
 				[xn (eval n)] )
 			   (dump xe xn) ) )
 			((r) (report))
-			((q) (exit))
+			((q) (##sys#quit-hook))
 			((l)
 			 (let ((fns (string-split (read-line))))
 			   (for-each load fns)
@@ -1087,7 +1087,10 @@ EOF
       (do ([args args (cdr args)])
 	  ((null? args)
 	   (unless batch 
-	     (repl csi-eval)
+	     (call/cc
+	      (lambda (k)
+		(set! ##sys#quit-hook (lambda _ (k #f)))
+		(repl csi-eval)))
 	     (##sys#write-char-0 #\newline ##sys#standard-output) ) )
 	(let* ((arg (car args)))
 	  (cond ((member arg simple-options))
diff --git a/eval.scm b/eval.scm
index e2701566..af7dbd2a 100644
--- a/eval.scm
+++ b/eval.scm
@@ -1552,6 +1552,7 @@
 	    (ehandler (##sys#error-handler))
 	    (rhandler (##sys#reset-handler)) 
 	    (lv #f)
+	    (qh ##sys#quit-hook)
 	    (uie ##sys#unbound-in-eval) )
 
 	(define (saveports)
@@ -1564,82 +1565,86 @@
 	  (set! ##sys#standard-output stdout)
 	  (set! ##sys#standard-error stderr) )
 
-	(##sys#dynamic-wind
-	 (lambda ()
-	   (set! lv (load-verbose))
-	   (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 (char=? #\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#unbound-in-eval uie)
-	   (##sys#error-handler ehandler)
-	   (##sys#reset-handler rhandler) ) ) ) ) ) )
+	(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 (char=? #\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:
diff --git a/library.scm b/library.scm
index f5590526..a5897f44 100644
--- a/library.scm
+++ b/library.scm
@@ -145,8 +145,10 @@ EOF
 
 ;;; System routines:
 
-(define (exit . code) (apply (##sys#exit-handler) code))
+(define (exit #!optional code) ((##sys#exit-handler) code))
 (define (reset) ((##sys#reset-handler)))
+(define (##sys#quit-hook result) ((##sys#reset-handler)))
+(define (quit #!optional result) (##sys#quit-hook result))
 
 (define (##sys#error . args)
   (if (pair? args)
diff --git a/manual/Unit eval b/manual/Unit eval
index 69eaeca5..181d3688 100644
--- a/manual/Unit eval	
+++ b/manual/Unit eval	
@@ -110,6 +110,8 @@ 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.
+
 
 === Loading extension libraries
 
diff --git a/manual/Unit library b/manual/Unit library
index d5856ee0..619b0eb2 100644
--- a/manual/Unit library	
+++ b/manual/Unit library	
@@ -420,6 +420,8 @@ Exit the running process and return exit-code, which defaults to 0
 
 Note that pending {{dynamic-wind}} thunks are ''not'' invoked when exiting your program in this way.
 
+
+
 ==== build-platform
 
 <procedure>(build-platform)</procedure>
@@ -676,6 +678,14 @@ Returns an s-expression with debug information for the procedure {{PROC}}, or
 {{#f}}, if {{PROC}} has no associated debug information.
 
 
+==== quit
+
+<procedure>(quit [RESULT])</procedure>
+
+In the interpreter {{quit}} exits the currently active read-eval-print loop.
+In compiled code, it is equivalent to calling {{reset}}. See also: {{repl}}.
+
+
 ==== reset
 
 <procedure>(reset)</procedure>
diff --git a/types.db b/types.db
index 7363afb0..1603fda7 100644
--- a/types.db
+++ b/types.db
@@ -392,6 +392,7 @@
 (program-name (procedure program-name (#!optional string) string))
 (promise? (procedure promise? (*) boolean))
 (put! (procedure put! (symbol symbol *) undefined))
+(quit (procedure quit (#!optional *) noreturn))
 (register-feature! (procedure register-feature! (#!rest symbol) undefined))
 (remprop! (procedure remprop! (symbol symbol) undefined))
 (rename-file (procedure rename-file (string string) string))
Trap