flush whitespace from the repl input buffer *before* evaluation
authorAndy Wingo <wingo@pobox.com>
Mon, 22 Jun 2009 20:57:48 +0000 (22:57 +0200)
committerAndy Wingo <wingo@pobox.com>
Mon, 22 Jun 2009 20:57:48 +0000 (22:57 +0200)
* 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

index 86fb56f..2f4a378 100644 (file)
           (newline)
           (set! status '()))
          (else
+          ;; since the input port is line-buffered, consume up to the
+          ;; newline
+          (flush-to-newline)
           (with-backtrace
            (catch 'quit
                   (lambda ()
              ((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