Pressing <Enter> sends your command line "(readline)\n" to Racket's reader, but Racket's reader only reads enough of the input such as "(readline)" to read a complete expression.
arc> (readc);
#\;
arc> (readline);hello there
";hello there"
A reasonable fix would be for the REPL loop, when it knows its input is coming from the terminal and so won't see the final line of input unless you've pressed enter, to do its own "(readline)" before evaluating the expression, and so to consume the excess input.
Interesting, and not entirely wanted, I think. Is there a way to prompt for a new character? I don't see a way to clear out a port; peekc waits for a character to peek at; readall waits until you type nil.
Scheme's 'char-ready? is probably close to what you're looking for. It returns #f if the runtime can guarantee that the stream would have blocked if it were read from at that time, and otherwise it returns #t.
; This exploits an Arc 3.1 bug to drop to Racket (as seen at
; http://arclanguage.org/item?id=11838). It's unnecessary on Anarki.
(mac $ (racket-expr)
`(cdr `(nil . ,,racket-expr)))
(def discard-input ((o str (stdin)))
" Reads all the characters from the stream, giving up partway if it
can determine the stream would block. The return value is `nil'. "
(while:and $.char-ready?.str readc.str))
arc>
(do (pr "enter something> ")
(discard-input)
(prn "The first character was " (tostring:write:readc) ".")
(discard-input))
enter something> something
The first character was #\s.
nil
arc>