branch: elpa/racket-mode commit fd3e3ddf12aef6d7661b5a2c0f70afc7107b7fd9 Author: Greg Hendershott <g...@greghendershott.com> Commit: Greg Hendershott <g...@greghendershott.com>
Handle REPL submissions with multiple read-able values; fixes #705 The REPL redesign in commit 2522488 regressed #319. Revive that desired behavior in the new design. --- racket/interaction.rkt | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/racket/interaction.rkt b/racket/interaction.rkt index 179ee7f210..98e601cba7 100644 --- a/racket/interaction.rkt +++ b/racket/interaction.rkt @@ -13,13 +13,33 @@ (provide get-interaction) +;; This input port holds the unread remainder of the most-recent +;; submission string from the current-submissions channel. (Although +;; commonly each submission is one read-able value, like "1\n", it +;; might contain more than one read-able value, e.g. the user submits +;; "1 2 3\n". In that case we want to print each result on its own +;; line, without excess prompts.) +(define current-submission-input-port (make-parameter (open-input-string ""))) + (define (get-interaction prompt) (maybe-warn-for-session) - (repl-output-prompt (string-append prompt ">")) - (define str (get-submission)) - (define in (open-input-string str)) - (with-stack-checkpoint - ((current-read-interaction) 'racket-mode-repl in))) + (define (get) + (with-handlers ([exn:fail:read? + (λ (exn) + ;; Discard remainder after this read error. + (current-submission-input-port (open-input-string "")) + (raise exn))]) + (current-get-interaction-input-port (λ () (current-submission-input-port))) + (with-stack-checkpoint + ((current-read-interaction) 'racket-mode-repl (current-submission-input-port))))) + (define v (get)) + (cond + [(eof-object? v) + (repl-output-prompt (string-append prompt ">")) + (current-submission-input-port (open-input-string (get-submission))) + (port-count-lines! (current-submission-input-port)) + (get)] + [else v])) (define current-get-interaction-evt (dynamic-require 'racket/base 'current-get-interaction-evt (λ () #f)))