1 ;;;; stuff related to the toplevel read-eval-print loop, plus some
2 ;;;; other miscellaneous functions that we don't have any better place
5 ;;;; This software is part of the SBCL system. See the README file for
8 ;;;; This software is derived from the CMU CL system, which was
9 ;;;; written at Carnegie Mellon University and released into the
10 ;;;; public domain. The software is in the public domain and is
11 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
12 ;;;; files for more information.
14 (in-package "SB!IMPL")
16 ;;;; magic specials initialized by GENESIS
18 ;;; FIXME: The DEFVAR here is redundant with the (DECLAIM (SPECIAL ..))
19 ;;; of all static symbols in early-impl.lisp.
21 (defvar sb!vm::*current-catch-block*)
22 (defvar sb!vm::*current-unwind-protect-block*)
23 #!+hpux (defvar sb!vm::*c-lra*)
24 (defvar *free-interrupt-context-index*))
26 ;;; specials initialized by !COLD-INIT
28 ;;; FIXME: These could be converted to DEFVARs.
29 (declaim (special #!+(or x86 x86-64) *pseudo-atomic-bits*
30 *allow-with-interrupts*
33 #!+sb-thruption *thruption-pending*
34 *type-system-initialized*))
36 (defvar *cold-init-complete-p*)
38 ;;; counts of nested errors (with internal errors double-counted)
39 (defvar *maximum-error-depth*)
40 (defvar *current-error-depth*)
42 ;;;; default initfiles
44 (defun sysinit-pathname ()
45 (or (let ((sbcl-homedir (sbcl-homedir-pathname)))
47 (probe-file (merge-pathnames "sbclrc" sbcl-homedir))))
49 (merge-pathnames "sbcl\\sbclrc"
50 (sb!win32::get-folder-pathname
51 sb!win32::csidl_common_appdata))
55 (defun userinit-pathname ()
56 (merge-pathnames ".sbclrc" (user-homedir-pathname)))
58 (defvar *sysinit-pathname-function* #'sysinit-pathname
60 "Designator for a function of zero arguments called to obtain a
61 pathname designator for the default sysinit file, or NIL. If the
62 function returns NIL, no sysinit file is used unless one has been
63 specified on the command-line.")
65 (defvar *userinit-pathname-function* #'userinit-pathname
67 "Designator for a function of zero arguments called to obtain a
68 pathname designator or a stream for the default userinit file, or NIL.
69 If the function returns NIL, no userinit file is used unless one has
70 been specified on the command-line.")
73 ;;;; miscellaneous utilities for working with with TOPLEVEL
75 ;;; Execute BODY in a context where any %END-OF-THE-WORLD (thrown e.g.
76 ;;; by QUIT) is caught and any final processing and return codes are
77 ;;; handled appropriately.
78 (defmacro handling-end-of-the-world (&body body)
80 (catch '%end-of-the-world
82 (with-local-interrupts
89 (defvar *exit-in-process* nil)
90 (declaim (type (or null real) *exit-timeout*))
91 (defvar *exit-timeout* 60
92 "Default amount of seconds, if any, EXIT should wait for other
93 threads to finish after terminating them. Default value is 60. NIL
94 means to wait indefinitely.")
96 (defun os-exit-handler (condition)
97 (declare (ignore condition))
98 (os-exit *exit-in-process* :abort t))
100 (defvar *exit-error-handler* #'os-exit-handler)
102 (defun call-exit-hooks ()
103 (unless *exit-in-process*
104 (setf *exit-in-process* 0))
105 (handler-bind ((serious-condition *exit-error-handler*))
106 (call-hooks "exit" *exit-hooks* :on-error :warn)))
109 ;; If anything goes wrong, we will exit immediately and forcibly.
110 (handler-bind ((serious-condition *exit-error-handler*))
112 (code *exit-in-process*))
114 ;; Another thread called EXIT, and passed the buck to us -- only
115 ;; final call left to do.
116 (os-exit (car code) :abort nil)
119 (flush-standard-output-streams)
120 (sb!thread::%exit-other-threads)
122 (os-exit code :abort (not ok)))))))
124 ;;;; working with *CURRENT-ERROR-DEPTH* and *MAXIMUM-ERROR-DEPTH*
126 ;;; INFINITE-ERROR-PROTECT is used by ERROR and friends to keep us out
128 (defmacro infinite-error-protect (&rest forms)
129 `(unless (infinite-error-protector)
130 (/show0 "back from INFINITE-ERROR-PROTECTOR")
131 (let ((*current-error-depth* (1+ *current-error-depth*)))
132 (/show0 "in INFINITE-ERROR-PROTECT, incremented error depth")
133 ;; arbitrary truncation
134 #!+sb-show (sb!debug:print-backtrace :count 8)
137 ;;; a helper function for INFINITE-ERROR-PROTECT
138 (defun infinite-error-protector ()
139 (/show0 "entering INFINITE-ERROR-PROTECTOR, *CURRENT-ERROR-DEPTH*=..")
140 (/hexstr *current-error-depth*)
141 (cond ((not *cold-init-complete-p*)
142 (%primitive print "Argh! error in cold init, halting")
143 (%primitive sb!c:halt))
144 ((or (not (boundp '*current-error-depth*))
145 (not (realp *current-error-depth*))
146 (not (boundp '*maximum-error-depth*))
147 (not (realp *maximum-error-depth*)))
148 (%primitive print "Argh! corrupted error depth, halting")
149 (%primitive sb!c:halt))
150 ((> *current-error-depth* *maximum-error-depth*)
151 (/show0 "*MAXIMUM-ERROR-DEPTH*=..")
152 (/hexstr *maximum-error-depth*)
153 (/show0 "in INFINITE-ERROR-PROTECTOR, calling ERROR-ERROR")
154 (error-error "Help! "
155 *current-error-depth*
157 "SB-KERNEL:*MAXIMUM-ERROR-DEPTH* exceeded.")
160 (/show0 "returning normally from INFINITE-ERROR-PROTECTOR")
163 ;;; FIXME: I had a badly broken version of INFINITE-ERROR-PROTECTOR at
164 ;;; one point (shown below), and SBCL cross-compiled it without
165 ;;; warning about FORMS being undefined. Check whether that problem
166 ;;; (missing warning) is repeatable in the final system and if so, fix
169 (defun infinite-error-protector ()
170 `(cond ((not *cold-init-complete-p*)
171 (%primitive print "Argh! error in cold init, halting")
172 (%primitive sb!c:halt))
173 ((or (not (boundp '*current-error-depth*))
174 (not (realp *current-error-depth*))
175 (not (boundp '*maximum-error-depth*))
176 (not (realp *maximum-error-depth*)))
177 (%primitive print "Argh! corrupted error depth, halting")
178 (%primitive sb!c:halt))
179 ((> *current-error-depth* *maximum-error-depth*)
180 (/show0 "in INFINITE-ERROR-PROTECTOR, calling ERROR-ERROR")
181 (error-error "Help! "
182 *current-error-depth*
184 "SB-KERNEL:*MAXIMUM-ERROR-DEPTH* exceeded.")
188 (/show0 "in INFINITE-ERROR-PROTECTOR, returning normally")
192 ;;;; miscellaneous external functions
194 (defun sleep (seconds)
196 "This function causes execution to be suspended for SECONDS. SECONDS may be
197 any non-negative real number."
198 (when (or (not (realp seconds))
200 (error 'simple-type-error
201 :format-control "Invalid argument to SLEEP: ~S, ~
202 should be a non-negative real."
203 :format-arguments (list seconds)
205 :expected-type '(real 0)))
206 #!-(and win32 (not sb-thread))
207 (multiple-value-bind (sec nsec)
208 (if (integerp seconds)
210 (multiple-value-bind (sec frac)
212 (values sec (truncate frac 1e-9))))
213 ;; nanosleep() accepts time_t as the first argument, but on some platforms
214 ;; it is restricted to 100 million seconds. Maybe someone can actually
215 ;; have a reason to sleep for over 3 years?
216 (loop while (> sec (expt 10 8))
217 do (decf sec (expt 10 8))
218 (sb!unix:nanosleep (expt 10 8) 0))
219 (sb!unix:nanosleep sec nsec))
220 #!+(and win32 (not sb-thread))
221 (sb!win32:millisleep (truncate (* seconds 1000)))
224 ;;;; the default toplevel function
228 "a list of all the values returned by the most recent top level EVAL")
229 (defvar // nil #!+sb-doc "the previous value of /")
230 (defvar /// nil #!+sb-doc "the previous value of //")
231 (defvar * nil #!+sb-doc "the value of the most recent top level EVAL")
232 (defvar ** nil #!+sb-doc "the previous value of *")
233 (defvar *** nil #!+sb-doc "the previous value of **")
234 (defvar + nil #!+sb-doc "the value of the most recent top level READ")
235 (defvar ++ nil #!+sb-doc "the previous value of +")
236 (defvar +++ nil #!+sb-doc "the previous value of ++")
237 (defvar - nil #!+sb-doc "the form currently being evaluated")
239 (defun interactive-eval (form &key (eval #'eval))
241 "Evaluate FORM, returning whatever it returns and adjusting ***, **, *,
242 +++, ++, +, ///, //, /, and -."
245 (let ((results (multiple-value-list (funcall eval form))))
256 ;; The bogon returned an unbound marker.
257 ;; FIXME: It would be safer to check every one of the values in RESULTS,
258 ;; instead of just the first one.
260 (cerror "Go on with * set to NIL."
261 "EVAL returned an unbound marker."))
264 ;;; Flush anything waiting on one of the ANSI Common Lisp standard
265 ;;; output streams before proceeding.
266 (defun flush-standard-output-streams ()
267 (let ((null (make-broadcast-stream)))
268 (dolist (name '(*debug-io*
274 ;; 0. Pull out the underlying stream, so we know what it is.
275 ;; 1. Handle errors on it. We're doing this on entry to
276 ;; debugger, so we don't want recursive errors here.
277 ;; 2. Rebind the stream symbol in case some poor sod sees
278 ;; a broken stream here while running with *BREAK-ON-ERRORS*.
279 (let ((stream (stream-output-stream (symbol-value name))))
280 (progv (list name) (list null)
281 (handler-bind ((stream-error
283 (when (eq stream (stream-error-stream c))
285 (force-output stream))))
289 (defun stream-output-stream (stream)
294 (stream-output-stream
295 (symbol-value (synonym-stream-symbol stream))))
297 (stream-output-stream
298 (two-way-stream-output-stream stream)))
302 (defun process-init-file (specified-pathname kind)
303 (multiple-value-bind (context default-function)
306 (values "sysinit" *sysinit-pathname-function*))
308 (values "userinit" *userinit-pathname-function*)))
309 (if specified-pathname
310 (with-open-file (stream (parse-native-namestring specified-pathname)
311 :if-does-not-exist nil)
313 (load-as-source stream :context context)
314 (cerror "Ignore missing init file"
315 "The specified ~A file ~A was not found."
316 context specified-pathname)))
317 (let ((default (funcall default-function)))
319 (with-open-file (stream (pathname default) :if-does-not-exist nil)
321 (load-as-source stream :context context))))))))
323 (defun process-eval/load-options (options)
324 (/show0 "handling --eval and --load options")
325 (flet ((process-1 (cons)
326 (destructuring-bind (opt . value) cons
329 (with-simple-restart (continue "Ignore runtime option --eval ~S."
331 (multiple-value-bind (expr pos) (read-from-string value)
332 (if (eq value (read-from-string value nil value :start pos))
334 (error "Multiple expressions in --eval option: ~S"
337 (with-simple-restart (continue "Ignore runtime option --load ~S."
339 (load (native-pathname value))))
342 (flush-standard-output-streams)))
343 (with-simple-restart (abort "Skip rest of --eval and --load options.")
344 (dolist (option options)
345 (process-1 option)))))
347 (defun process-script (script)
348 (flet ((load-script (stream)
349 ;; Scripts don't need to be stylish or fast, but silence is usually a
350 ;; desirable quality...
351 (handler-bind (((or style-warning compiler-note) #'muffle-warning)
352 (stream-error (lambda (e)
354 (when (member (stream-error-stream e)
355 (list *stdout* *stdin* *stderr*))
357 ;; Let's not use the *TTY* for scripts, ok? Also, normally we use
358 ;; synonym streams, but in order to have the broken pipe/eof error
359 ;; handling right we want to bind them for scripts.
360 (let ((*terminal-io* (make-two-way-stream *stdin* *stdout*))
361 (*debug-io* (make-two-way-stream *stdin* *stderr*))
362 (*standard-input* *stdin*)
363 (*standard-output* *stdout*)
364 (*error-output* *stderr*))
365 (load stream :verbose nil :print nil)))))
366 (handling-end-of-the-world
368 (load-script *stdin*)
369 (with-open-file (f (native-pathname script) :element-type :default)
370 (sb!fasl::maybe-skip-shebang-line f)
373 ;; Errors while processing the command line cause the system to EXIT,
374 ;; instead of trying to go into the Lisp debugger, because trying to
375 ;; go into the Lisp debugger would get into various annoying issues of
376 ;; where we should go after the user tries to return from the
378 (defun startup-error (control-string &rest args)
379 (format *error-output*
380 "fatal error before reaching READ-EVAL-PRINT loop: ~% ~?~%"
385 ;;; the default system top level function
386 (defun toplevel-init ()
387 (/show0 "entering TOPLEVEL-INIT")
388 (let ( ;; value of --sysinit option
390 ;; t if --no-sysinit option given
392 ;; value of --userinit option
394 ;; t if --no-userinit option given
396 ;; t if --disable-debugger option given
397 (disable-debugger nil)
398 ;; list of (<kind> . <string>) conses representing --eval and --load
399 ;; options. options. --eval options are stored as strings, so that
400 ;; they can be passed to READ only after their predecessors have been
401 ;; EVALed, so that things work when e.g. REQUIRE in one EVAL form
402 ;; creates a package referred to in the next EVAL form. Storing the
403 ;; original string also makes for easier debugging.
404 (reversed-options nil)
405 ;; Has a --noprint option been seen?
407 ;; Has a --script option been seen?
409 ;; Quit after processing other options?
411 ;; everything in *POSIX-ARGV* except for argv[0]=programname
412 (options (rest *posix-argv*)))
414 (declare (type list options))
416 (/show0 "done with outer LET in TOPLEVEL-INIT")
418 ;; FIXME: There are lots of ways for errors to happen around here
419 ;; (e.g. bad command line syntax, or READ-ERROR while trying to
420 ;; READ an --eval string). Make sure that they're handled
423 ;; Process command line options.
424 (loop while options do
425 (/show0 "at head of LOOP WHILE OPTIONS DO in TOPLEVEL-INIT")
426 (let ((option (first options)))
427 (flet ((pop-option ()
431 "unexpected end of command line options"))))
432 (cond ((string= option "--script")
434 (setf disable-debugger t
437 script (if options (pop-option) t))
439 ((string= option "--sysinit")
442 (startup-error "multiple --sysinit options")
443 (setf sysinit (pop-option))))
444 ((string= option "--no-sysinit")
447 ((string= option "--userinit")
450 (startup-error "multiple --userinit options")
451 (setf userinit (pop-option))))
452 ((string= option "--no-userinit")
454 (setf no-userinit t))
455 ((string= option "--eval")
457 (push (cons :eval (pop-option)) reversed-options))
458 ((string= option "--load")
460 (push (cons :load (pop-option)) reversed-options))
461 ((string= option "--noprint")
464 ((string= option "--disable-debugger")
466 (setf disable-debugger t))
467 ((string= option "--quit")
469 (setf finally-quit t))
470 ((string= option "--non-interactive")
471 ;; This option is short for --quit and --disable-debugger,
472 ;; which are needed in combination for reliable non-
473 ;; interactive startup.
475 (setf finally-quit t)
476 (setf disable-debugger t))
477 ((string= option "--end-toplevel-options")
481 ;; Anything we don't recognize as a toplevel
482 ;; option must be the start of user-level
483 ;; options.. except that if we encounter
484 ;; "--end-toplevel-options" after we gave up
485 ;; because we didn't recognize an option as a
486 ;; toplevel option, then the option we gave up on
487 ;; must have been an error. (E.g. in
488 ;; "sbcl --eval '(a)' --eval'(b)' --end-toplevel-options"
489 ;; this test will let us detect that the string
490 ;; "--eval(b)" is an error.)
491 (if (find "--end-toplevel-options" options
493 (startup-error "bad toplevel option: ~S"
496 (/show0 "done with LOOP WHILE OPTIONS DO in TOPLEVEL-INIT")
498 ;; Delete all the options that we processed, so that only
499 ;; user-level options are left visible to user code.
501 (setf (rest *posix-argv*) options))
503 ;; Disable debugger before processing initialization files & co.
504 (when disable-debugger
505 (sb!ext:disable-debugger))
507 ;; Handle initialization files.
508 (/show0 "handling initialization files in TOPLEVEL-INIT")
509 ;; This CATCH is needed for the debugger command TOPLEVEL to
511 (catch 'toplevel-catcher
512 ;; We wrap all the pre-REPL user/system customized startup
513 ;; code in a restart.
515 ;; (Why not wrap everything, even the stuff above, in this
516 ;; restart? Errors above here are basically command line
517 ;; or Unix environment errors, e.g. a missing file or a
518 ;; typo on the Unix command line, and you don't need to
519 ;; get into Lisp to debug them, you should just start over
520 ;; and do it right at the Unix level. Errors below here
521 ;; are generally errors in user Lisp code, and it might be
522 ;; helpful to let the user reach the REPL in order to help
523 ;; figure out what's going on.)
527 (process-init-file sysinit :system))
529 (process-init-file userinit :user))
531 (push (list :quit) reversed-options))
532 (process-eval/load-options (nreverse reversed-options))
534 (process-script script)
535 (bug "PROCESS-SCRIPT returned")))
540 ;; In case script calls (enable-debugger)!
541 "Abort script, exiting lisp."
542 "Skip to toplevel READ/EVAL/PRINT loop.")
544 (/show0 "CONTINUEing from pre-REPL RESTART-CASE")
545 (values)) ; (no-op, just fall through)
547 :report "Exit SBCL (calling #'EXIT, killing the process)."
548 :test (lambda (c) (declare (ignore c)) (not script))
549 (/show0 "falling through to EXIT from pre-REPL RESTART-CASE")
552 ;; one more time for good measure, in case we fell out of the
553 ;; RESTART-CASE above before one of the flushes in the ordinary
554 ;; flow of control had a chance to operate
555 (flush-standard-output-streams)
557 (/show0 "falling into TOPLEVEL-REPL from TOPLEVEL-INIT")
558 (toplevel-repl noprint)
559 ;; (classic CMU CL error message: "You're certainly a clever child.":-)
560 (critically-unreachable "after TOPLEVEL-REPL")))
562 ;;; hooks to support customized toplevels like ACL-style toplevel from
563 ;;; KMR on sbcl-devel 2002-12-21. Altered by CSR 2003-11-16 for
564 ;;; threaded operation: altered *REPL-FUN* to *REPL-FUN-GENERATOR*.
565 (defvar *repl-read-form-fun* #'repl-read-form-fun
567 "A function of two stream arguments IN and OUT for the toplevel REPL to
568 call: Return the next Lisp form to evaluate (possibly handling other magic --
569 like ACL-style keyword commands -- which precede the next Lisp form). The OUT
570 stream is there to support magic which requires issuing new prompts.")
571 (defvar *repl-prompt-fun* #'repl-prompt-fun
573 "A function of one argument STREAM for the toplevel REPL to call: Prompt
574 the user for input.")
575 (defvar *repl-fun-generator* (constantly #'repl-fun)
577 "A function of no arguments returning a function of one argument NOPRINT
578 that provides the REPL for the system. Assumes that *STANDARD-INPUT* and
579 *STANDARD-OUTPUT* are set up.")
581 ;;; read-eval-print loop for the default system toplevel
582 (defun toplevel-repl (noprint)
583 (/show0 "entering TOPLEVEL-REPL")
584 (let ((* nil) (** nil) (*** nil)
586 (+ nil) (++ nil) (+++ nil)
587 (/// nil) (// nil) (/ nil))
588 (/show0 "about to funcall *REPL-FUN-GENERATOR*")
589 (let ((repl-fun (funcall *repl-fun-generator*)))
590 ;; Each REPL in a multithreaded world should have bindings of
591 ;; most CL specials (most critically *PACKAGE*).
592 (with-rebound-io-syntax
593 (handler-bind ((step-condition 'invoke-stepper))
595 (/show0 "about to set up restarts in TOPLEVEL-REPL")
596 ;; CLHS recommends that there should always be an
597 ;; ABORT restart; we have this one here, and one per
600 (abort "~@<Exit debugger, returning to top level.~@:>")
601 (catch 'toplevel-catcher
602 ;; In the event of a control-stack-exhausted-error, we
603 ;; should have unwound enough stack by the time we get
604 ;; here that this is now possible.
606 (sb!kernel::reset-control-stack-guard-page)
607 (funcall repl-fun noprint)
608 (critically-unreachable "after REPL")))))))))
610 ;;; Our default REPL prompt is the minimal traditional one.
611 (defun repl-prompt-fun (stream)
613 (write-string "* " stream)) ; arbitrary but customary REPL prompt
615 ;;; Our default form reader does relatively little magic, but does
616 ;;; handle the Unix-style EOF-is-end-of-process convention.
617 (defun repl-read-form-fun (in out)
618 (declare (type stream in out) (ignore out))
619 ;; KLUDGE: *READ-SUPPRESS* makes the REPL useless, and cannot be
620 ;; recovered from -- flip it here.
621 (when *read-suppress*
622 (warn "Setting *READ-SUPPRESS* to NIL to restore toplevel usability.")
623 (setf *read-suppress* nil))
624 (let* ((eof-marker (cons nil nil))
625 (form (read in nil eof-marker)))
626 (if (eq form eof-marker)
630 (defun repl-fun (noprint)
631 (/show0 "entering REPL")
635 ;; (See comment preceding the definition of SCRUB-CONTROL-STACK.)
636 (scrub-control-stack)
637 (sb!thread::get-foreground)
639 (flush-standard-output-streams)
640 (funcall *repl-prompt-fun* *standard-output*)
641 ;; (Should *REPL-PROMPT-FUN* be responsible for doing its own
642 ;; FORCE-OUTPUT? I can't imagine a valid reason for it not to
643 ;; be done here, so leaving it up to *REPL-PROMPT-FUN* seems
644 ;; odd. But maybe there *is* a valid reason in some
645 ;; circumstances? perhaps some deadlock issue when being driven
646 ;; by another process or something...)
647 (force-output *standard-output*))
648 (let* ((form (funcall *repl-read-form-fun*
651 (results (multiple-value-list (interactive-eval form))))
653 (dolist (result results)
656 ;; If we started stepping in the debugger we want to stop now.
657 (disable-stepping))))
659 ;;; a convenient way to get into the assembly-level debugger
661 (%primitive sb!c:halt))