Arc Forumnew | comments | leaders | submitlogin
3 points by aw 4754 days ago | link | parent

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.


1 point by zck 4754 days ago | link

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.

-----

2 points by rocketnia 4754 days ago | link

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>

-----