#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/dbgcmd.scm,v 14.9 1990/09/12 02:47:19 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/dbgcmd.scm,v 14.10 1990/11/02 02:06:08 cph Rel $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
(define (letter-commands command-set message prompt state)
(with-standard-proceed-point
(lambda ()
- (let ((state (vector command-set prompt state))
- (cmdl (nearest-cmdl)))
- (let ((input-port (cmdl/input-port cmdl)))
- (input-port/immediate-mode input-port
- (lambda ()
- (make-cmdl cmdl
- input-port
- (cmdl/output-port cmdl)
- letter-commands/driver
- state
- message))))))))
+ (push-cmdl letter-commands/driver
+ (vector command-set prompt state)
+ message
+ make-cmdl))))
(define (letter-commands/driver cmdl)
(let ((command-set (vector-ref (cmdl/state cmdl) 0))
(hook/leaving-command-loop thunk))
(define (default/leaving-command-loop thunk)
- (input-port/normal-mode (cmdl/input-port (nearest-cmdl)) thunk))
+ (thunk))
(define (debug/read-eval-print environment from to prompt)
(leaving-command-loop
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/input.scm,v 14.8 1990/10/03 01:29:12 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/input.scm,v 14.9 1990/11/02 02:06:16 cph Exp $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
(define (input-port/discard-chars port delimiters)
((input-port/operation/discard-chars port) port delimiters))
-(define (input-port/normal-mode port thunk)
- (let ((operation (input-port/custom-operation port 'NORMAL-MODE)))
- (if operation
- (operation port thunk)
- (thunk))))
-
-(define (input-port/immediate-mode port thunk)
- (let ((operation (input-port/custom-operation port 'IMMEDIATE-MODE)))
- (if operation
- (operation port thunk)
- (thunk))))
+(define (input-port/channel port)
+ (let ((operation (input-port/custom-operation port 'CHANNEL)))
+ (and operation
+ (operation port))))
(define eof-object
"EOF Object")
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/io.scm,v 14.9 1990/10/16 21:03:07 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/io.scm,v 14.10 1990/11/02 02:06:23 cph Exp $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
\f
;;;; Terminal Primitives
-(define (terminal-raw-output channel)
- ((ucode-primitive terminal-raw-output 1) (channel-descriptor channel)))
+(define (terminal-get-state channel)
+ ((ucode-primitive terminal-get-state 1) (channel-descriptor channel)))
-(define (terminal-cooked-output channel)
- ((ucode-primitive terminal-cooked-output 1) (channel-descriptor channel)))
+(define (terminal-set-state channel state)
+ ((ucode-primitive terminal-set-state 2) (channel-descriptor channel) state))
-(define (terminal-buffered? channel)
+(define (terminal-cooked-input? channel)
((ucode-primitive terminal-buffered? 1) (channel-descriptor channel)))
-(define (terminal-buffered channel)
+(define (terminal-cooked-input channel)
((ucode-primitive terminal-buffered 1) (channel-descriptor channel)))
-(define (terminal-nonbuffered channel)
+(define (terminal-raw-input channel)
((ucode-primitive terminal-nonbuffered 1) (channel-descriptor channel)))
+(define (terminal-cooked-output? channel)
+ ((ucode-primitive terminal-cooked-output? 1) (channel-descriptor channel)))
+
+(define (terminal-cooked-output channel)
+ ((ucode-primitive terminal-cooked-output 1) (channel-descriptor channel)))
+
+(define (terminal-raw-output channel)
+ ((ucode-primitive terminal-raw-output 1) (channel-descriptor channel)))
+
(define (terminal-flush-input channel)
((ucode-primitive terminal-flush-input 1) (channel-descriptor channel)))
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/output.scm,v 14.7 1990/09/13 23:08:23 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/output.scm,v 14.8 1990/11/02 02:06:32 cph Rel $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
(copier %output-port/copy)
(print-procedure output-port/unparse))
state
- start-of-line?
(operation/write-char false read-only true)
(operation/write-string false read-only true)
(operation/flush-output false read-only true)
(define (output-port/copy port state)
(let ((result (%output-port/copy port)))
(set-output-port/state! result state)
- (set-output-port/start-of-line?! result false)
result))
(define (output-port/custom-operation port name)
(operation 'WRITE-STRING default-operation/write-string))
(flush-output
(operation 'FLUSH-OUTPUT default-operation/flush-output)))
- (%make-output-port state false write-char write-string flush-output
+ (%make-output-port state write-char write-string flush-output
operations
(append '(WRITE-CHAR WRITE-STRING FLUSH-OUTPUT)
(map car operations)))))))
false)
\f
(define (output-port/write-char port char)
- (set-output-port/start-of-line?! port (char=? #\newline char))
((output-port/operation/write-char port) port char))
(define (output-port/write-string port string)
(let ((length (string-length string)))
(if (positive? length)
- (begin
- (set-output-port/start-of-line?!
- port
- (char=? #\newline (string-ref string (-1+ length))))
- ((output-port/operation/write-string port) port string)))))
-
-(define (output-port/fresh-line port)
- (if (not (output-port/start-of-line? port))
- (begin
- (set-output-port/start-of-line?! port true)
- ((output-port/operation/write-char port) port #\newline))))
+ ((output-port/operation/write-string port) port string))))
(define (output-port/flush-output port)
((output-port/operation/flush-output port) port))
(operation port)))
79))
+(define (output-port/channel port)
+ (let ((operation (output-port/custom-operation port 'CHANNEL)))
+ (and operation
+ (operation port))))
+
(define *current-output-port*)
(define-integrable (current-output-port)
(output-port/flush-output port))
unspecific)
-(define (fresh-line #!optional port)
- (let ((port
- (if (default-object? port)
- (current-output-port)
- (guarantee-output-port port))))
- (output-port/fresh-line port)
- (output-port/flush-output port))
- unspecific)
-
(define (write-char char #!optional port)
(let ((port
(if (default-object? port)
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/rep.scm,v 14.14 1990/06/20 20:29:50 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/rep.scm,v 14.15 1990/11/02 02:06:39 cph Exp $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
(let loop ((message "Cold load finished"))
(with-standard-proceed-point
(lambda ()
- (make-repl false
- user-repl-environment
- user-repl-syntax-table
- user-initial-prompt
+ (make-cmdl false
console-input-port
console-output-port
- (cmdl-message/standard message))))
+ repl-driver
+ (make-repl-state user-initial-prompt
+ user-repl-environment
+ user-repl-syntax-table)
+ (cmdl-message/standard message)
+ make-cmdl)))
(loop "Reset!"))))
\f
;;;; Command Loops
(level false read-only true)
(driver false read-only true)
(proceed-continuation false read-only true)
+ (spawn-child false read-only true)
continuation
input-port
output-port
state)
-(define (make-cmdl parent input-port output-port driver state message)
+(define (make-cmdl parent input-port output-port driver state message
+ spawn-child)
(if (and parent (not (cmdl? parent)))
- (error "MAKE-CMDL: illegal parent" parent))
+ (error:illegal-datum parent 'MAKE-CMDL))
(let ((cmdl
(%make-cmdl parent
(let loop ((parent parent))
1))
driver
(current-proceed-continuation)
+ spawn-child
false
input-port
output-port
(if (not *nearest-cmdl*) (error "NEAREST-CMDL: no cmdl"))
*nearest-cmdl*)
-(define (push-cmdl driver state message)
- (let ((cmdl (nearest-cmdl)))
- (make-cmdl cmdl
- (cmdl/input-port cmdl)
- (cmdl/output-port cmdl)
- driver
- state
- message)))
+(define (push-cmdl driver state message spawn-child)
+ (let ((parent (nearest-cmdl)))
+ ((cmdl/spawn-child parent) parent
+ (cmdl/input-port parent)
+ (cmdl/output-port parent)
+ driver
+ state
+ message
+ spawn-child)))
(define (cmdl/base cmdl)
(let ((parent (cmdl/parent cmdl)))
(define hook/cmdl-prompt)
(define (default/cmdl-prompt cmdl prompt)
- (write-string
- (string-append "\n\n" (number->string (cmdl/level cmdl)) " " prompt " ")
- (cmdl/output-port cmdl)))
+ (use-output-port cmdl
+ (lambda (output-port)
+ (write-string
+ (string-append "\n\n"
+ (number->string (cmdl/level cmdl))
+ " "
+ prompt
+ " ")
+ output-port))))
(define ((cmdl-message/standard string) cmdl)
(hook/cmdl-message cmdl string))
(define hook/cmdl-message)
(define (default/cmdl-message cmdl string)
- (write-string (string-append "\n" string) (cmdl/output-port cmdl)))
+ (use-output-port cmdl
+ (lambda (output-port)
+ (write-string (string-append "\n" string) output-port))))
(define ((cmdl-message/strings . strings) cmdl)
- (let ((port (cmdl/output-port cmdl)))
- (for-each (lambda (string)
- (write-string (string-append "\n" string) port))
- strings)))
+ (use-output-port cmdl
+ (lambda (output-port)
+ (for-each (lambda (string)
+ (write-string (string-append "\n" string) output-port))
+ strings))))
(define ((cmdl-message/null) cmdl)
cmdl
false)
(define ((cmdl-message/active thunk) cmdl)
- (with-output-to-port (cmdl/output-port cmdl)
- thunk))
+ (use-output-port cmdl
+ (lambda (output-port)
+ (with-output-to-port output-port thunk))))
(define ((cmdl-message/append . messages) cmdl)
(for-each (lambda (message) (message cmdl)) messages))
\f
;;;; REP Loops
-(define-structure (repl-state (conc-name repl-state/))
+(define-structure (repl-state
+ (conc-name repl-state/)
+ (constructor make-repl-state
+ (prompt environment syntax-table)))
prompt
environment
syntax-table
- reader-history
- printer-history)
+ (reader-history (make-repl-history reader-history-size))
+ (printer-history (make-repl-history printer-history-size)))
-(define (make-repl parent environment syntax-table prompt input-port
- output-port message)
- (input-port/normal-mode input-port
- (lambda ()
- (make-cmdl parent
- input-port
- output-port
- repl-driver
- (make-repl-state prompt
- environment
- syntax-table
- (make-repl-history reader-history-size)
- (make-repl-history printer-history-size))
- (cmdl-message/append
- message
- (cmdl-message/active
- (lambda ()
- (hook/repl-environment (nearest-repl) environment))))))))
+(define (push-repl environment message prompt)
+ (push-cmdl repl-driver
+ (make-repl-state prompt environment (nearest-repl/syntax-table))
+ (cmdl-message/append
+ message
+ (cmdl-message/active
+ (lambda ()
+ (hook/repl-environment (nearest-repl) environment))))
+ make-cmdl))
(define (repl-driver repl)
(fluid-let ((hook/error-handler default/error-handler))
(repl/syntax-table repl)
user-initial-syntax-table)))
-(define (push-repl environment message prompt)
- (let ((parent (nearest-cmdl)))
- (make-repl parent
- environment
- (nearest-repl/syntax-table)
- prompt
- (cmdl/input-port parent)
- (cmdl/output-port parent)
- message)))
-
(define (read-eval-print environment message prompt)
(with-standard-proceed-point
(lambda ()
unspecific)
(define (default/repl-read repl)
- (let ((s-expression (read (cmdl/input-port repl))))
+ (let ((s-expression (read-internal (cmdl/input-port repl))))
(repl-history/record! (repl/reader-history repl) s-expression)
s-expression))
(define (default/repl-write repl object)
(repl-history/record! (repl/printer-history repl) object)
- (let ((port (cmdl/output-port repl)))
- (if (undefined-value? object)
- (write-string "\n;No value" port)
- (begin
- (write-string "\n;Value: " port)
- (write object port)))))
+ (use-output-port repl
+ (lambda (output-port)
+ (if (undefined-value? object)
+ (write-string "\n;No value" output-port)
+ (begin
+ (write-string "\n;Value: " output-port)
+ (write object output-port))))))
\f
;;;; History
;;; User Interface Stuff
(define user-repl-environment)
-(define user-repl-syntax-table)
(define (pe)
(let ((environment (nearest-repl/environment)))
(environment (->environment environment)))
(set! user-repl-environment environment)
(set-repl-state/environment! (cmdl/state repl) environment)
- (hook/repl-environment repl environment)
+ (use-output-port repl
+ (lambda (output-port)
+ output-port
+ (hook/repl-environment repl environment)))
environment))
(define (ve environment)
(environment (->environment environment)))
(set-repl-state/environment! (cmdl/state repl) environment)
(set-repl-state/prompt! (cmdl/state repl) "Visiting->")
- (hook/repl-environment repl environment)
+ (use-output-port repl
+ (lambda (output-port)
+ output-port
+ (hook/repl-environment repl environment)))
environment))
(define (->environment object)
(if (not package)
(error "->ENVIRONMENT: Not an environment" object))
(package/environment package)))))
+\f
+(define user-repl-syntax-table)
(define (gst syntax-table)
(guarantee-syntax-table syntax-table)
(read-char-internal (cmdl/input-port cmdl)))
(define (default/prompt-for-confirmation cmdl prompt)
- (let ((input-port (cmdl/input-port cmdl))
- (output-port (cmdl/output-port cmdl)))
- (input-port/immediate-mode input-port
- (lambda ()
+ (let ((input-port (cmdl/input-port cmdl)))
+ (use-output-port cmdl
+ (lambda (output-port)
(let loop ()
(newline output-port)
(write-string prompt output-port)
(loop)))))))))
(define (default/prompt-for-expression cmdl prompt)
- (let ((input-port (cmdl/input-port cmdl))
- (output-port (cmdl/output-port cmdl)))
- (newline output-port)
- (write-string prompt output-port)
- (write-string ": " output-port)
- (input-port/normal-mode input-port
+ (use-output-port cmdl
+ (lambda (output-port)
+ (newline output-port)
+ (write-string prompt output-port)
+ (write-string ": " output-port)))
+ (read-internal (cmdl/input-port cmdl)))
+\f
+(define (use-output-port cmdl user)
+ (let ((output-port (cmdl/output-port cmdl)))
+ (terminal-bind terminal-cooked-output (output-port/channel output-port)
(lambda ()
- (read input-port)))))
+ (user output-port)))))
+
+(define (read-internal input-port)
+ (terminal-bind terminal-cooked-input (input-port/channel input-port)
+ (lambda ()
+ (read input-port))))
(define (read-char-internal input-port)
- (let loop ()
- (let ((char (read-char input-port)))
- (if (char=? char char:newline)
- (loop)
- char))))
\ No newline at end of file
+ (terminal-bind terminal-raw-input (input-port/channel input-port)
+ (lambda ()
+ (let loop ()
+ (let ((char (read-char input-port)))
+ (if (char=? char char:newline)
+ (loop)
+ char))))))
+
+(define (terminal-bind operation terminal thunk)
+ (if (and terminal
+ (channel-type=terminal? terminal))
+ (let ((outside-state)
+ (inside-state false))
+ (dynamic-wind
+ (lambda ()
+ (set! outside-state (terminal-get-state terminal))
+ (if inside-state
+ (begin
+ (terminal-set-state terminal inside-state)
+ (set! inside-state)
+ unspecific)
+ (operation terminal)))
+ thunk
+ (lambda ()
+ (set! inside-state (terminal-get-state terminal))
+ (terminal-set-state terminal outside-state)
+ (set! outside-state)
+ unspecific)))
+ (thunk)))
\ No newline at end of file
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/runtime.pkg,v 14.81 1990/10/17 03:30:37 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/runtime.pkg,v 14.82 1990/11/02 02:06:48 cph Exp $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
current-input-port
eof-object?
guarantee-input-port
+ input-port/channel
input-port/char-ready?
input-port/copy
input-port/custom-operation
input-port/operation/peek-char
input-port/operation/read-char
input-port/operation/read-string
- input-port/immediate-mode
- input-port/normal-mode
input-port/peek-char
input-port/read-char
input-port/read-string
close-output-port
current-output-port
display
- fresh-line
guarantee-output-port
make-output-port
newline
+ output-port/channel
output-port/copy
output-port/custom-operation
output-port/flush-output
- output-port/fresh-line
output-port/operation
output-port/operation-names
output-port/state
output-buffer/write-char-block
output-buffer/write-string-block)
(export (runtime console-output)
- channel-type=terminal?
channel-write-char-block
channel-write-string-block
make-output-buffer
output-buffer/size
output-buffer/write-char-block
output-buffer/write-string-block
- terminal-cooked-output
- terminal-output-baud-rate
- terminal-raw-output
tty-output-channel)
(export (runtime console-input)
channel-type=file?
- channel-type=terminal?
input-buffer/buffered-chars
input-buffer/channel
input-buffer/char-ready?
input-buffer/peek-char
input-buffer/read-char
make-input-buffer
- terminal-buffered
- terminal-buffered?
- terminal-input-baud-rate
- terminal-nonbuffered
tty-input-channel)
+ (export (runtime rep)
+ channel-type=terminal?
+ terminal-cooked-input
+ terminal-cooked-output
+ terminal-get-state
+ terminal-raw-input
+ terminal-set-state)
(initialization (initialize-package!)))
(define-package (runtime program-copier)
in
initial-top-level-repl
make-cmdl
- make-repl
nearest-cmdl
nearest-repl
nearest-repl/environment
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/version.scm,v 14.99 1990/10/16 21:03:42 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/version.scm,v 14.100 1990/11/02 02:07:08 cph Exp $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
'()))
(add-system! microcode-system)
(add-event-receiver! event:after-restore snarf-microcode-version!)
- (add-identification! "Runtime" 14 99))
+ (add-identification! "Runtime" 14 100))
(define microcode-system)
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/runtime.pkg,v 14.81 1990/10/17 03:30:37 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/runtime/runtime.pkg,v 14.82 1990/11/02 02:06:48 cph Exp $
Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
current-input-port
eof-object?
guarantee-input-port
+ input-port/channel
input-port/char-ready?
input-port/copy
input-port/custom-operation
input-port/operation/peek-char
input-port/operation/read-char
input-port/operation/read-string
- input-port/immediate-mode
- input-port/normal-mode
input-port/peek-char
input-port/read-char
input-port/read-string
close-output-port
current-output-port
display
- fresh-line
guarantee-output-port
make-output-port
newline
+ output-port/channel
output-port/copy
output-port/custom-operation
output-port/flush-output
- output-port/fresh-line
output-port/operation
output-port/operation-names
output-port/state
output-buffer/write-char-block
output-buffer/write-string-block)
(export (runtime console-output)
- channel-type=terminal?
channel-write-char-block
channel-write-string-block
make-output-buffer
output-buffer/size
output-buffer/write-char-block
output-buffer/write-string-block
- terminal-cooked-output
- terminal-output-baud-rate
- terminal-raw-output
tty-output-channel)
(export (runtime console-input)
channel-type=file?
- channel-type=terminal?
input-buffer/buffered-chars
input-buffer/channel
input-buffer/char-ready?
input-buffer/peek-char
input-buffer/read-char
make-input-buffer
- terminal-buffered
- terminal-buffered?
- terminal-input-baud-rate
- terminal-nonbuffered
tty-input-channel)
+ (export (runtime rep)
+ channel-type=terminal?
+ terminal-cooked-input
+ terminal-cooked-output
+ terminal-get-state
+ terminal-raw-input
+ terminal-set-state)
(initialization (initialize-package!)))
(define-package (runtime program-copier)
in
initial-top-level-repl
make-cmdl
- make-repl
nearest-cmdl
nearest-repl
nearest-repl/environment