DrRacket REPL不放弃EOF

时间:2015-10-14 14:42:24

标签: racket

我尝试使用DrRacket的REPL来测试用户是否输入了y字符。

为此,我使用了这样的代码:

(eq? (read-char) #\y)

当我运行此代码时,DrRacket会显示一个带有 EOF 按钮的输入文本框,我想我在完成输入时应该点击

所以我的输入是 y eof ,它返回true,但是当我第二次运行代码行时,我没有得到文本框;相反,它会立即返回false。我猜这是因为它没有从缓冲区中丢弃 eof ,所以它将它与y进行比较。

如何告诉REPL不要在缓冲区中包含 eof

1 个答案:

答案 0 :(得分:2)

如果要发送eof-object,则需要单击EOF按钮。 原则上,当读取文件结束对象时,端口上不应再出现任何输入。

在repl中,用户通常使用enter / return来表示输入已完成。 因此,我建议您在DrRacket中使用此约定。

这个程序:

#lang racket    
(define (yes? [display-message #t])
  (when display-message
    (displayln "Enter y or n:"))
  (match (read-line)
    ["y" 'yes]
    ["n" 'no]
    [else (yes? #f)]))

(displayln (yes?)) (flush-output)
(displayln (yes?)) (flush-output)

似乎有用(当使用eof按钮时也是如此)。