X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-aclrepl%2Ftoplevel.lisp;h=316c8fb0366aecb6cb120cd6716a7dcc2b5cc785;hb=644a1ff36dd578321fd0592aa47748e8af741542;hp=cdcc09b7b5d452cec85a631e1070bf873ac88524;hpb=e8f691fc1ba5e3aebc74fd8723c7cc550a4f1e35;p=sbcl.git diff --git a/contrib/sb-aclrepl/toplevel.lisp b/contrib/sb-aclrepl/toplevel.lisp index cdcc09b..316c8fb 100644 --- a/contrib/sb-aclrepl/toplevel.lisp +++ b/contrib/sb-aclrepl/toplevel.lisp @@ -1,17 +1,28 @@ (cl:defpackage :sb-aclrepl - (:use :cl :sb-ext)) + (:use "COMMON-LISP" "SB-EXT") + (:shadowing-import-from "SB-IMPL" "SCRUB-CONTROL-STACK") + (:shadowing-import-from "SB-INT" "*REPL-PROMPT-FUN*" "*REPL-READ-FORM-FUN*" "*STEP*" "*STEPPING*") + (:export + ;; user-level customization of UI + "*PROMPT*" "*EXIT-ON-EOF*" "*MAX-HISTORY*" + "*USE-SHORT-PACKAGE-NAME*" "*COMMAND-CHAR*" + ;; user-level customization of functionality + "ALIAS" + ;; internalsish, but the documented way to make a new repl "object" + ;; such that it inherits the current state of the repl but has its + ;; own independent state subsequently. + "MAKE-REPL-FUN")) (cl:in-package :sb-aclrepl) -(defvar *noprint* nil "boolean: T if don't print prompt and output") -(defvar *break-level* 0 "current break level") -(defvar *inspect-break* nil "boolean: T if break caused by inspect") -(defvar *continuable-break* nil "boolean: T if break caused by continuable error") - -(shadowing-import '(sb-impl::scrub-control-stack - sb-int:*repl-prompt-fun* sb-int:*repl-read-form-fun*) - :sb-aclrepl) - +(defvar *noprint* nil + "boolean: T if don't print prompt and output") +(defvar *break-level* 0 + "current break level") +(defvar *inspect-break* nil + "boolean: T if break caused by inspect") +(defvar *continuable-break* nil + "boolean: T if break caused by continuable error") (defun repl (&key (break-level (1+ *break-level*)) @@ -27,7 +38,12 @@ (multiple-value-bind (reason reason-param) (catch 'repl-catcher (loop - (rep-one))) + (unwind-protect + (rep-one) + ;; reset toplevel step-condition handler + (setf *step* nil + *stepping* nil)))) + (declare (ignore reason-param)) (cond ((and (eq reason :inspect) (plusp *break-level*)) @@ -55,13 +71,10 @@ (results (multiple-value-list (sb-impl::interactive-eval form)))) (unless *noprint* (dolist (result results) - ;; Don't fresh-line before a result, since newline was entered by user - ;; in *repl-read-form-fun* + ;; FIXME: Calling fresh-line before a result ensures the result starts + ;; on a newline, but it usually generates an empty line. + ;; One solution would be to have the newline's entered on the + ;; input stream inform the output stream that the column should be + ;; reset to the beginning of the line. (fresh-line *standard-output*) (prin1 result *standard-output*))))) - -(defun repl-fun (noprint) - (repl :noprint noprint :break-level 0)) - -(when (boundp 'sb-impl::*repl-fun*) - (setq sb-impl::*repl-fun* #'repl-fun))