diff --git a/collects/mred/mred.ss b/collects/mred/mred.ss index 4dc1b0c4..7f6f6e3f 100644 --- a/collects/mred/mred.ss +++ b/collects/mred/mred.ss @@ -1,4 +1,3 @@ - (module mred mzscheme (require (prefix wx: (lib "kernel.ss" "mred" "private"))) (require (lib "class.ss") @@ -4518,30 +4517,21 @@ (check-installer 'default-text-keymap-initializer))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REPL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define bold-blue-style-delta - (send (make-object wx:style-delta% 'change-bold) set-delta-foreground "BLUE")) -(define italic-red-style-delta - (send (make-object wx:style-delta% 'change-italic) set-delta-foreground "RED")) -(define grey-style-delta - (send (make-object wx:style-delta%) set-delta-foreground "GRAY")) + (define (-graphical-read-eval-print-loop user-esp) ;; The REPL buffer class (define esq:text% (class100 text% () - (inherit insert last-position get-text erase change-style clear-undos - begin-edit-sequence end-edit-sequence lock is-locked?) + (inherit insert last-position get-text erase change-style clear-undos) (rename [super-on-char on-char]) - (private-field - [prompt-pos 0] - [locked? #f]) + (private-field [prompt-pos 0] [locked? #f]) (override [can-insert? (lambda (start end) (and (>= start prompt-pos) (not locked?)))] [can-delete? (lambda (start end) (and (>= start prompt-pos) (not locked?)))] [on-char (lambda (c) (super-on-char c) (when (and (memq (send c get-key-code) '(#\return #\newline #\003)) - (not locked?) - (not (is-locked?))) + (not locked?)) (set! locked? #t) (evaluate (get-text prompt-pos (last-position)))))]) (public @@ -4555,40 +4545,30 @@ (set! locked? #f) (insert str) (set! locked? l?)))] - [kill-repl - (lambda () - (set! locked? #f) - (lock #f) - (change-style grey-style-delta 0 (last-position)) - (lock #t))] [reset (lambda () (set! locked? #f) - (lock #f) - (begin-edit-sequence) (set! prompt-pos 0) (erase) - (let ([s (last-position)] - [m (regexp-match "^(.*), (Copyright.*)$" (banner))]) - (insert (format "Welcome to ~a." (cadr m))) - (let ([e (last-position)]) - (insert #\newline) - (change-style bold-blue-style-delta s e)) - (output (caddr m))) - (insert "This is a simple window for evaluating MrEd Scheme expressions.") - (insert #\newline) - (let ([s (last-position)]) - (insert "Quit now and run DrScheme to get a better window.") - (let ([e (last-position)]) - (insert #\newline) - (change-style italic-red-style-delta s e))) - (insert "The current input port always returns eof.") - (insert #\newline) - (new-prompt) - (end-edit-sequence) - (clear-undos))]) + (new-prompt))]) (sequence (super-init) - (reset)))) + (let ([s (last-position)] + [m (regexp-match "^(.*), (Copyright.*)$" (banner))]) + (insert (format "Welcome to ~a." (cadr m))) + (let ([e (last-position)]) + (insert #\newline) + (change-style (send (make-object wx:style-delta% 'change-bold) set-delta-foreground "BLUE") s e)) + (output (caddr m))) + (insert "This is a simple window for evaluating MrEd Scheme expressions.") (insert #\newline) + (let ([s (last-position)]) + (insert "Quit now and run DrScheme to get a better window.") + (let ([e (last-position)]) + (insert #\newline) + (change-style + (send (make-object wx:style-delta% 'change-italic) set-delta-foreground "RED") + s e))) + (insert "The current input port always returns eof.") (insert #\newline) + (new-prompt)))) ;; GUI creation (define frame (make-object (class100 frame% args @@ -4602,23 +4582,6 @@ (apply super-init args) (accept-drop-files #t))) "MrEd REPL" #f 500 400)) (define repl-buffer (make-object esq:text%)) - - (define execute-panel (make-object horizontal-panel% frame)) - (define execute-button - (and (not user-esp) - (make-object button% "Execute File..." execute-panel - (lambda (x y) (do-execute))))) - (define reset-button - (and (not user-esp) - (make-object button% "Reset" execute-panel - (lambda (x y) - (do-reset))))) - (define kill-button - (and (not user-esp) - (make-object button% "Kill" execute-panel - (lambda (x y) - (do-kill))))) - (define repl-display-canvas (make-object editor-canvas% frame)) (define esq-eventspace (wx:current-eventspace)) @@ -4627,39 +4590,18 @@ (wx:queue-callback proc #f))) ;; User space initialization - (define user-custodian 'user-custodian-not-yet-set) - (define user-namespace 'user-namespace-not-yet-set) + (define user-custodian (make-custodian)) + (define user-output-port (make-output-port (lambda (s) (queue-output (lambda () (send repl-buffer output s)))) (lambda () 'nothing-to-close))) - (define user-eventspace 'user-eventspace-not-yet-set) + (define user-eventspace + (or user-esp + (parameterize ((current-custodian user-custodian)) + (wx:make-eventspace)))) - (define (user-space-init) - (set! user-custodian (make-custodian)) - (set! user-eventspace - (or user-esp - (parameterize ((current-custodian user-custodian)) - (wx:make-eventspace)))) - - (set! user-namespace (make-namespace)) - (let ([mred-name ((current-module-name-resolver) '(lib "mred.ss" "mred") #f #f)] - [orig-namespace (current-namespace)]) - (parameterize ([current-namespace user-namespace]) - (namespace-attach-module orig-namespace mred-name) - (namespace-require '(lib "mred.ss" "mred")))) - - (unless user-esp - (parameterize ((wx:current-eventspace user-eventspace)) - (wx:queue-callback - (lambda () - (current-namespace user-namespace) - (current-output-port user-output-port) - (current-error-port user-output-port) - (current-input-port (make-input-port (lambda () eof) void void))) - #t)))) - ;; Evaluation (define (evaluate expr-str) @@ -4667,7 +4609,7 @@ (wx:queue-callback (lambda () (dynamic-wind - (lambda () (send execute-button enable #f)) + void (lambda () (call-with-values (lambda () (eval (read (open-input-string expr-str)))) @@ -4679,110 +4621,34 @@ (newline))) results)))) (lambda () - (queue-output (lambda () (send repl-buffer new-prompt))) - (send execute-button enable #t))))))) + (queue-output (lambda () (send repl-buffer new-prompt))))))))) (define waiting (make-semaphore 0)) - - (define execute-menu-item 'execute-menu-item-not-yet-set) - (define execute-filename #f) - (define (update-execute-label) - (when execute-button - (let ([label (if execute-filename - (format "Execute ~a" execute-filename) - "Execute File...")]) - (send execute-button set-label label) - (send execute-menu-item set-label label)))) - (define (do-execute) - (unless execute-filename - (set! execute-filename (get-file #f frame)) - (when execute-filename - (update-execute-label))) - (when execute-filename - (do-reset) - (send execute-button enable #f) - (evaluate (format "(load ~s)" execute-filename)))) - (define (do-reset) - (custodian-shutdown-all user-custodian) - (user-space-init) - (send repl-buffer reset) - (send execute-button enable #t)) - (define (do-kill) - (custodian-shutdown-all user-custodian) - (send repl-buffer kill-repl)) - - (send execute-panel stretchable-height #f) - (when execute-button - (send execute-button stretchable-width #t)) - - (define execute-menu-item 'execute-menu-item-not-yet-set) - (define execute-filename #f) - (define (update-execute-label) - (when execute-button - (let ([label (if execute-filename - (format "Execute ~a" execute-filename) - "Execute File...")]) - (send execute-button set-label label) - (send execute-menu-item set-label label)))) - (define (do-execute) - (unless execute-filename - (set! execute-filename (get-file)) - (when execute-filename - (update-execute-label))) - (when execute-filename - (do-reset) - (evaluate (format "(load ~s)" execute-filename)))) - (define (do-reset) - (custodian-shutdown-all user-custodian) - (user-space-init) - (send repl-buffer reset)) - (define (do-kill) - (custodian-shutdown-all user-custodian) - (send repl-buffer kill-repl)) - - (send execute-panel stretchable-height #f) - (when execute-button - (send execute-button stretchable-width #t)) (let ([mb (make-object menu-bar% frame)]) (let ([m (make-object menu% "&File" mb)]) - (make-object menu-item% "Load File..." m - (lambda (i e) (let ([f (get-file #f frame)]) (and f (evaluate (format "(load ~s)" f)))))) + (make-object menu-item% "Load File..." m (lambda (i e) (let ([f (get-file #f frame)]) (and f (evaluate (format "(load ~s)" f)))))) (make-object menu-item% - (if (eq? (system-type) 'windows) - "E&xit" - "&Quit") - m (lambda (i e) (send frame on-close) (send frame show #f)) #\q)) + (if (eq? (system-type) 'windows) + "E&xit" + "&Quit") + m (lambda (i e) (send frame on-close) (send frame show #f)) #\q)) (let ([m (make-object menu% "&Edit" mb)]) - (append-editor-operation-menu-items m #f)) - (unless user-esp - (let ([m (make-object menu% "&Scheme" mb)]) - (set! execute-menu-item - (make-object menu-item% "Execute" m - (lambda (i e) - (do-execute)) - #\t)) - (make-object menu-item% "Reset" m - (lambda (i e) - (do-reset)) - #\r) - (make-object menu-item% "Kill" m - (lambda (i e) - (do-kill)) - #\k) - (make-object menu-item% "Reset Execute Button" m - (lambda (i e) - (set! execute-filename #f) - (update-execute-label)))))) - - (update-execute-label) + (append-editor-operation-menu-items m #f))) ;; Just a few extra key bindings: ((current-text-keymap-initializer) (send repl-buffer get-keymap)) (send repl-buffer auto-wrap #t) ;; Go - (user-space-init) + (unless user-esp + (parameterize ((wx:current-eventspace user-eventspace)) + (wx:queue-callback + (lambda () + (current-output-port user-output-port) + (current-error-port user-output-port) + (current-input-port (make-input-port (lambda () eof) void void))) + #t))) (send repl-display-canvas set-editor repl-buffer)