From 0d646345f477f0ffced6f602370fc8c607f7d32f Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 22 Jun 2009 22:57:48 +0200 Subject: [PATCH] flush whitespace from the repl input buffer *before* evaluation * module/system/repl/repl.scm (start-repl): Given that the input port of the repl is line-buffered, it's likely we have #\newline in the input that is strictly extraneous, an in-band indicator to the repl that it should begin reading now. So flush out that newline, so that you can (read-char) at the repl, and it actually does wait for you to type in a char instead of just returning #\newline. While it's not an overriding concern, this does fix some brainfuck programs that want to input from the user. --- module/system/repl/repl.scm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/module/system/repl/repl.scm b/module/system/repl/repl.scm index 86fb56fd2..2f4a3783a 100644 --- a/module/system/repl/repl.scm +++ b/module/system/repl/repl.scm @@ -107,6 +107,9 @@ (newline) (set! status '())) (else + ;; since the input port is line-buffered, consume up to the + ;; newline + (flush-to-newline) (with-backtrace (catch 'quit (lambda () @@ -134,3 +137,14 @@ ((char-whitespace? ch) (read-char) (next-char wait)) (else ch))) #f)) + +(define (flush-to-newline) + (if (char-ready?) + (let ((ch (peek-char))) + (if (and (not (eof-object? ch)) (char-whitespace? ch)) + (begin + (read-char) + (if (not (char=? ch #\newline)) + (flush-to-newline))))))) + + \ No newline at end of file