2015-10-14 55 views
2

我正在嘗試使用DrRacket的REPL來測試用戶是否輸入了y字符。DrRacket REPL不放棄EOF

爲此,我用這樣的代碼:

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

當我運行這段代碼,DrRacket顯示輸入文本框與EOF按鈕,我想我應該當點擊我完成了我的輸入。

所以我的輸入,然後是ŸEOF返回true,但後來當我運行的代碼,第二次行了,我不明白的文本框;相反,它立即返回false。我猜這是因爲它沒有丟棄緩衝區中的eof,所以它將它與y進行比較。

我該如何告訴REPL不要在緩衝區中包含eof

回答

2

您打算在發送eof對象時單擊EOF按鈕。 原則上,當讀取文件結束對象時,端口上不應再出現輸入。

在repl中,用戶通常使用輸入/返回來表示輸入已完成。 因此,我建議您在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按鈕)。

+0

可以使用匹配「y」和「yes」的正則表達式來代替「y」作爲匹配模式。 – soegaard

+0

謝謝你澄清EOF按鈕;但是,使用Enter時我會得到相同的行爲:換行符保存在緩衝區中,並在下一次調用read-char時使用。 –

+0

在上面的解決方案中,我使用'read-line'來讀取字符和換行符。如果你想使用'read-char',那麼你需要讀取字符和下面的換行符(即使用兩次調用'read-char'而不是一次)。爲了更好的建議發佈實際的代碼。 – soegaard