Changeset 688


Ignore:
Timestamp:
Mar 22, 2004, 9:30:02 AM (21 years ago)
Author:
Gary Byers
Message:

toplevel loop changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/level-1/l1-readloop-lds.lisp

    r658 r688  
    1818
    1919(in-package "CCL")
     20
     21
    2022
    2123(defun toplevel-loop ()
     
    150152;This is the part common to toplevel loop and inner break loops.
    151153(defun read-loop (&key (break-level *break-level*)
    152                        (prompt-function #'(lambda () (print-listener-prompt t)))
     154                       (prompt-function #'(lambda (stream) (print-listener-prompt stream t)))
    153155                       (input-stream *terminal-io*)
    154156                       (output-stream *terminal-io*))
     
    157159         *loading-file-source-file*
    158160         *in-read-loop*
    159          (*listener-p* t)
    160161         *** ** * +++ ++ + /// // / -
    161          form)
     162         (eof-value (cons nil nil)))
     163    (declare (dynamic-extent eof-value))
    162164    (loop
    163165      (restart-case
     
    166168            (catch-cancel
    167169              (loop               
    168                 (setq *loading-file-source-file* nil
    169                       *in-read-loop* nil
     170                (setq *in-read-loop* nil
    170171                      *break-level* break-level)
    171                 (setq form (toplevel-read :input-stream input-stream
    172                                           :output-stream output-stream
    173                                           :prompt-function prompt-function))
    174                 (if (eq form *eof-value*)
    175                   (if (eof-transient-p (stream-device input-stream :input))
    176                     (progn
    177                       (stream-clear-input *terminal-io*)
    178                       (abort-break))
    179                     (quit))
    180                   (or (check-toplevel-command form)
    181                       (toplevel-print
    182                        (toplevel-eval form))))))
     172                (multiple-value-bind (form path print-result)
     173                    (toplevel-read :input-stream input-stream
     174                                   :output-stream output-stream
     175                                   :prompt-function prompt-function
     176                                   :eof-value eof-value)
     177                  (if (eq form eof-value)
     178                    (if (eof-transient-p (stream-device input-stream :input))
     179                      (progn
     180                        (stream-clear-input *terminal-io*)
     181                        (abort-break))
     182                      (quit))
     183                    (or (check-toplevel-command form)
     184                        (let* ((values (toplevel-eval form path)))
     185                        (if print-result (toplevel-print values))))))))
    183186            (format *terminal-io* "~&Cancelled")))
    184187        (abort () :report (lambda (stream)
     
    198201      (format *terminal-io* "~%"))))
    199202
     203
     204
    200205;Read a form from *terminal-io*.
    201206(defun toplevel-read (&key (input-stream *standard-input*)
    202207                           (output-stream *standard-output*)
    203                            (prompt-function #'print-listener-prompt))
    204   (let* ((listener input-stream))
    205     (force-output output-stream)
    206     (funcall prompt-function)
    207     (loop
    208         (let* ((*in-read-loop* nil)  ;So can abort out of buggy reader macros...
    209                (form))
    210           (catch '%re-read           
    211             (if (eq (setq form (read listener nil *eof-value*)) *eof-value*)
    212               (return form)
    213               (progn
    214                 (let ((ch)) ;Trim whitespace
    215                   (while (and (listen listener)
    216                               (setq ch (read-char listener nil nil))
    217                               (whitespacep cH))
    218                     (setq ch nil))
    219                   (when ch (unread-char ch listener)))
    220                 (when *listener-indent*
    221                   (write-char #\space listener)
    222                   (write-char #\space listener))
    223                 (return (process-single-selection form)))))))))
     208                           (prompt-function #'print-listener-prompt)
     209                           (eof-value *eof-value*))
     210  (force-output output-stream)
     211  (funcall prompt-function output-stream)
     212  (read-toplevel-form input-stream eof-value))
    224213
    225214(defvar *always-eval-user-defvars* nil)
     
    231220    form))
    232221
    233 (defun toplevel-eval (form &optional env)
     222(defun toplevel-eval (form &optional *loading-file-source-file*)
    234223  (setq +++ ++ ++ + + - - form)
    235224  (let* ((package *package*)
    236          (values (multiple-value-list (cheap-eval-in-environment form env))))
     225         (values (multiple-value-list (cheap-eval-in-environment form nil))))
    237226    (unless (eq package *package*)
    238       (application-ui-operation *application* :note-package *package*))
     227      (application-ui-operation *application* :note-current-package *package*))
    239228    values))
    240229
    241230(defun toplevel-print (values)
    242   (declare (resident))
    243231  (setq /// // // / / values)
    244232  (setq *** ** ** * * (if (neq (%car values) (%unbound-marker-8)) (%car values)))
     
    247235    (dolist (val values) (write val) (terpri))))
    248236
    249 (defun print-listener-prompt (&optional (force t))
     237(defun print-listener-prompt (stream &optional (force t))
    250238  (when (or force (neq *break-level* *last-break-level*))
    251239    (let* ((*listener-indent* nil))
    252       (fresh-line *terminal-io*)           
     240      (fresh-line stream)           
    253241      (if (%izerop *break-level*)
    254         (%write-string "?" *terminal-io*)
    255         (format *terminal-io* "~s >" *break-level*)))       
    256     (write-string " " *terminal-io*)       
     242        (%write-string "?" stream)
     243        (format stream "~s >" *break-level*)))       
     244    (write-string " " stream)       
    257245    (setq *last-break-level* *break-level*))
    258       (force-output *terminal-io*))
     246      (force-output stream))
    259247
    260248
Note: See TracChangeset for help on using the changeset viewer.