0.7.11.9:
authorWilliam Harold Newman <william.newman@airmail.net>
Sat, 18 Jan 2003 20:31:33 +0000 (20:31 +0000)
committerWilliam Harold Newman <william.newman@airmail.net>
Sat, 18 Jan 2003 20:31:33 +0000 (20:31 +0000)
added hooks, more or less as sketched by dan_b on sbcl-devel, to
 support kmr/acl-style alternate toplevel loop

CREDITS
package-data-list.lisp-expr
src/code/toplevel.lisp
version.lisp-expr

diff --git a/CREDITS b/CREDITS
index 03fa3b4..58d3e4a 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -595,6 +595,9 @@ William ("Bill") Newman:
   updating documentation, and even, for better or worse, getting
   rid of various functionality (e.g. the byte interpreter).
 
   updating documentation, and even, for better or worse, getting
   rid of various functionality (e.g. the byte interpreter).
 
+Kevin M. Rosenberg:
+  He provided the ACL-style toplevel.
+
 Christophe Rhodes:
   He ported SBCL to SPARC, made various port-related and SPARC-related
   changes (like *BACKEND-SUBFEATURES*), made many fixes and
 Christophe Rhodes:
   He ported SBCL to SPARC, made various port-related and SPARC-related
   changes (like *BACKEND-SUBFEATURES*), made many fixes and
index 60c1569..d1f4cb0 100644 (file)
@@ -896,7 +896,12 @@ retained, possibly temporariliy, because it might be used internally."
              "!BEGIN-COLLECTING-COLD-INIT-FORMS"
             "!COLD-INIT-FORMS"
             "COLD-FSET"
              "!BEGIN-COLLECTING-COLD-INIT-FORMS"
             "!COLD-INIT-FORMS"
             "COLD-FSET"
-             "!DEFUN-FROM-COLLECTED-COLD-INIT-FORMS"))
+             "!DEFUN-FROM-COLLECTED-COLD-INIT-FORMS"
+
+            ;; hooks for contrib/ stuff we're insufficiently sure
+            ;; about to add to SB!EXT
+            "*REPL-PROMPT-FUN*"
+            "*REPL-READ-FORM-FUN*"))
 
  ;; FIXME: This package is awfully huge. It'd probably be good to
  ;; split it. There's at least one natural way to split it: the
 
  ;; FIXME: This package is awfully huge. It'd probably be good to
  ;; split it. There's at least one natural way to split it: the
index 00495f5..2242b33 100644 (file)
           (repl noprint)
           (critically-unreachable "after REPL")))))))
 
           (repl noprint)
           (critically-unreachable "after REPL")))))))
 
+;;; Our default REPL prompt is the minimal traditional one.
+(defun repl-prompt-fun (stream)
+  (fresh-line stream)
+  (write-string "* " stream)) ; arbitrary but customary REPL prompt
+
+;;; Our default form reader does relatively little magic, but does
+;;; handle the Unix-style EOF-is-end-of-process convention.
+(defun repl-read-form-fun (in out)
+  (declare (type stream in out) (ignore out))
+  (let* ((eof-marker (cons nil nil))
+        (form (read in nil eof-marker)))
+    (if (eq form eof-marker)
+       (quit)
+       form)))
+
+;;; hooks to support customized toplevels like ACL-style toplevel
+;;; from KMR on sbcl-devel 2002-12-21
+(defvar *repl-read-form-fun* #'repl-read-form-fun
+  "a function of two stream arguments IN and OUT for the toplevel REPL to
+  call: Return the next Lisp form to evaluate (possibly handling other
+  magic -- like ACL-style keyword commands -- which precede the next
+  Lisp form). The OUT stream is there to support magic which requires
+  issuing new prompts.")
+(defvar *repl-prompt-fun* #'repl-prompt-fun
+  "a function of one argument STREAM for the toplevel REPL to call: Prompt
+  the user for input.")
+
 (defun repl (noprint)
   (/show0 "entering REPL")
   (let ((eof-marker (cons :eof nil)))
     (loop
 (defun repl (noprint)
   (/show0 "entering REPL")
   (let ((eof-marker (cons :eof nil)))
     (loop
-     ;; see comment preceding definition of SCRUB-CONTROL-STACK
+     ;; (See comment preceding the definition of SCRUB-CONTROL-STACK.)
      (scrub-control-stack)
      (unless noprint
      (scrub-control-stack)
      (unless noprint
-       (fresh-line)
-       (write-string "* ") ; arbitrary but customary REPL prompt
-       (flush-standard-output-streams))
-     (let ((form (read *standard-input* nil eof-marker)))
-       (cond ((eq form eof-marker)
-             (/show0 "doing QUIT for EOF in REPL")
-             (quit))
-            (t
-             (let ((results (multiple-value-list (interactive-eval form))))
-               (unless noprint
-                 (dolist (result results)
-                   (fresh-line)
-                   (prin1 result))))))))))
+       (funcall *repl-prompt-fun* *standard-output*)
+       ;; (Should *REPL-PROMPT-FUN* be responsible for doing its own
+       ;; FORCE-OUTPUT? I can't imagine a valid reason for it not to
+       ;; be done here, so leaving it up to *REPL-PROMPT-FUN* seems
+       ;; odd. But maybe there *is* a valid reason in some
+       ;; circumstances? perhaps some deadlock issue when being driven
+       ;; by another process or something...)
+       (force-output *standard-output*))
+     (let* ((form (funcall *repl-read-form-fun*
+                          *standard-input*
+                          *standard-output*))
+           (results (multiple-value-list (interactive-eval form))))
+       (unless noprint
+        (dolist (result results)
+          (fresh-line)
+          (prin1 result)))))))
 
 ;;; suitable value for *DEBUGGER-HOOK* for a noninteractive Unix-y program
 (defun noprogrammer-debugger-hook-fun (condition old-debugger-hook)
 
 ;;; suitable value for *DEBUGGER-HOOK* for a noninteractive Unix-y program
 (defun noprogrammer-debugger-hook-fun (condition old-debugger-hook)
index 20975cc..0a72f43 100644 (file)
@@ -18,4 +18,4 @@
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
 
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
 
-"0.7.11.8"
+"0.7.11.9"