mred -z and textual-read-eval-print-loop
svn: r9285
This commit is contained in:
parent
2b5d800190
commit
aa1a56c3fd
|
@ -231,6 +231,7 @@
|
||||||
text%
|
text%
|
||||||
pasteboard%
|
pasteboard%
|
||||||
graphical-read-eval-print-loop
|
graphical-read-eval-print-loop
|
||||||
|
textual-read-eval-print-loop
|
||||||
message-box
|
message-box
|
||||||
message+check-box
|
message+check-box
|
||||||
message-box/custom
|
message-box/custom
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
"mrmenu.ss"
|
"mrmenu.ss"
|
||||||
"filedialog.ss")
|
"filedialog.ss")
|
||||||
|
|
||||||
(provide graphical-read-eval-print-loop)
|
(provide graphical-read-eval-print-loop
|
||||||
|
textual-read-eval-print-loop)
|
||||||
|
|
||||||
(define (-graphical-read-eval-print-loop user-esp override-ports?)
|
(define (-graphical-read-eval-print-loop user-esp override-ports?)
|
||||||
;; The REPL buffer class
|
;; The REPL buffer class
|
||||||
|
@ -180,4 +181,57 @@
|
||||||
[(esp override-ports?)
|
[(esp override-ports?)
|
||||||
(unless (or (not esp) (wx:eventspace? esp))
|
(unless (or (not esp) (wx:eventspace? esp))
|
||||||
(raise-type-error 'graphical-read-eval-print-loop "eventspace or #f" esp))
|
(raise-type-error 'graphical-read-eval-print-loop "eventspace or #f" esp))
|
||||||
(-graphical-read-eval-print-loop esp override-ports?)])))
|
(-graphical-read-eval-print-loop esp override-ports?)]))
|
||||||
|
|
||||||
|
(define (textual-read-eval-print-loop)
|
||||||
|
(define user-custodian (make-custodian))
|
||||||
|
(define user-eventspace
|
||||||
|
(parameterize ((current-custodian user-custodian))
|
||||||
|
(wx:make-eventspace)))
|
||||||
|
(define ready-sema (make-semaphore))
|
||||||
|
(define (evaluate expr)
|
||||||
|
(parameterize ((wx:current-eventspace user-eventspace))
|
||||||
|
(wx:queue-callback
|
||||||
|
(lambda ()
|
||||||
|
(dynamic-wind
|
||||||
|
void
|
||||||
|
(lambda ()
|
||||||
|
(call-with-values
|
||||||
|
(lambda () (call-with-continuation-prompt
|
||||||
|
(lambda () (eval (cons
|
||||||
|
'#%top-interaction
|
||||||
|
expr)))))
|
||||||
|
(lambda results
|
||||||
|
(for-each
|
||||||
|
(lambda (v)
|
||||||
|
((current-print) v))
|
||||||
|
results))))
|
||||||
|
(lambda ()
|
||||||
|
(semaphore-post ready-sema)))))))
|
||||||
|
(parameterize-break
|
||||||
|
#f
|
||||||
|
(let loop ()
|
||||||
|
(let ([e (let read-loop ()
|
||||||
|
(call-with-continuation-prompt
|
||||||
|
;; Enable break during reading:
|
||||||
|
(lambda ()
|
||||||
|
(parameterize-break
|
||||||
|
#t
|
||||||
|
((current-prompt-read))))
|
||||||
|
(default-continuation-prompt-tag)
|
||||||
|
(lambda args (read-loop))))])
|
||||||
|
(unless (eof-object? e)
|
||||||
|
(evaluate e)
|
||||||
|
;; While waiting, redirect breaks:
|
||||||
|
(call-with-exception-handler
|
||||||
|
(lambda (exn)
|
||||||
|
(if (exn:break? exn)
|
||||||
|
(begin
|
||||||
|
(break-thread (eventspace-handler-thread user-eventspace))
|
||||||
|
((exn:break-continuation exn) (void)))
|
||||||
|
exn))
|
||||||
|
(lambda ()
|
||||||
|
(parameterize-break
|
||||||
|
#t
|
||||||
|
(semaphore-wait ready-sema))))
|
||||||
|
(loop)))))))
|
||||||
|
|
|
@ -200,7 +200,7 @@ See also @method[dc<%> get-text-extent].
|
||||||
[redirect-ports? any/c (not eval-eventspace)])
|
[redirect-ports? any/c (not eval-eventspace)])
|
||||||
void?]{
|
void?]{
|
||||||
|
|
||||||
Similar to MzScheme's @scheme[read-eval-print-loop], except that none of
|
Similar to @scheme[read-eval-print-loop], except that none of
|
||||||
@scheme[read-eval-print-loop]'s configuration parameters are used (such
|
@scheme[read-eval-print-loop]'s configuration parameters are used (such
|
||||||
as @scheme[current-read]) and the interaction occurs in a GUI window
|
as @scheme[current-read]) and the interaction occurs in a GUI window
|
||||||
instead of using the current input and output ports.
|
instead of using the current input and output ports.
|
||||||
|
@ -236,6 +236,27 @@ The keymap for the read-eval-print loop's editor is initialized by
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@defproc[(textual-read-eval-print-loop)
|
||||||
|
void?]{
|
||||||
|
|
||||||
|
Similar to @scheme[read-eval-print-loop], except that evaluation uses
|
||||||
|
a newly created eventspace.
|
||||||
|
|
||||||
|
The @scheme[current-prompt-read] parameter is used in the current
|
||||||
|
thread to read input. The result is queued for evaluation and
|
||||||
|
printing in the created eventspace's @tech{handler thread}, which
|
||||||
|
uses @scheme[current-eval] and @scheme[current-print]. After printing
|
||||||
|
completes for an interaction result, the next expression in read in
|
||||||
|
the original thread, and so on.
|
||||||
|
|
||||||
|
If an @scheme[exn:break] exception is raised in the original thread
|
||||||
|
during reading, it aborts the current call to @scheme[(current-read)]
|
||||||
|
and a new one is started. If an @scheme[exn:break] exception is raised
|
||||||
|
in the original thread while waiting for an interaction to complete, a
|
||||||
|
break is sent (via @scheme[break-thread]) to the created eventspace's
|
||||||
|
@tech{handler thread}.}
|
||||||
|
|
||||||
|
|
||||||
@defproc[(hide-cursor-until-moved)
|
@defproc[(hide-cursor-until-moved)
|
||||||
void?]{
|
void?]{
|
||||||
|
|
||||||
|
|
|
@ -171,8 +171,9 @@ flags:
|
||||||
'init-file)].}
|
'init-file)].}
|
||||||
|
|
||||||
@item{@FlagFirst{z} or @DFlagFirst{text-repl} : MrEd only; like
|
@item{@FlagFirst{z} or @DFlagFirst{text-repl} : MrEd only; like
|
||||||
@Flag{i}/@DFlag{repl}, but uses @scheme[read-eval-print-loop]
|
@Flag{i}/@DFlag{repl}, but uses
|
||||||
instead of @scheme[graphical-read-eval-print-loop].}
|
@scheme[textual-read-eval-print-loop] instead of
|
||||||
|
@scheme[graphical-read-eval-print-loop].}
|
||||||
|
|
||||||
@item{@FlagFirst{n} or @DFlagFirst{no-lib} : Skips requiring the
|
@item{@FlagFirst{n} or @DFlagFirst{no-lib} : Skips requiring the
|
||||||
initialization library (i.e., @schememodname[scheme/init] or
|
initialization library (i.e., @schememodname[scheme/init] or
|
||||||
|
|
|
@ -179,8 +179,8 @@ static void do_graph_repl(Scheme_Env *env)
|
||||||
|
|
||||||
if (!scheme_setjmp(newbuf)) {
|
if (!scheme_setjmp(newbuf)) {
|
||||||
if (xfa->a->alternate_rep) {
|
if (xfa->a->alternate_rep) {
|
||||||
a[0] = scheme_intern_symbol("scheme/base");
|
a[0] = scheme_intern_symbol("mred/mred");
|
||||||
a[1] = scheme_intern_symbol("read-eval-print-loop");
|
a[1] = scheme_intern_symbol("textual-read-eval-print-loop");
|
||||||
} else {
|
} else {
|
||||||
a[0] = scheme_intern_symbol("mred/mred");
|
a[0] = scheme_intern_symbol("mred/mred");
|
||||||
a[1] = scheme_intern_symbol("graphical-read-eval-print-loop");
|
a[1] = scheme_intern_symbol("graphical-read-eval-print-loop");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user