Functional programming 方案(DrRacket)-读取行不';不要在第二次尝试时停止输入

Functional programming 方案(DrRacket)-读取行不';不要在第二次尝试时停止输入,functional-programming,scheme,racket,Functional Programming,Scheme,Racket,我提示用户将2个值存储在2个不同的变量中,如下所示: (define (promptUser) (define varA 'a) (define varB 0) (display "Value or hit q/Q to terminate: ") (set! varA (read-line)) (cond ((or (string=? varA "q") (string=? varA "Q"))) (else (

我提示用户将2个值存储在2个不同的变量中,如下所示:

(define (promptUser)
  (define varA 'a)
  (define varB 0)

  (display "Value or hit q/Q to terminate: ") 
  (set! varA  (read-line))

  (cond
       ((or (string=? varA  "q") (string=? varA  "Q")))
       (else
           (display "Value for b: ")
           (set! varB (read))
           (promptUser)
       )
   )  
)
正如您所看到的,当我第一次调用
(promptUser)
时,它实际上会在
(读取行)
处停止等待用户输入,但由于某种原因,
(promptUser)
处的调用实际上跳过了第一次用户输入,并直接跳入
cond下的
else
案例中

错误示例如下:

它不会因为varA的输入而停止


有人能给我解释一下吗

以下方面存在一些问题:

(set! varB (read))
在drracket中进行测试时,“read”获取所有内容,直到分隔符,即空格或新行。我可以猜测新行字符将在下一个周期中使用:

(set! varA  (read-line))
当您在B中输入例如:“aaa bbb”并在下一个循环中显示varA的内容时,可以看到这一点。bbb会在那里。 如果您将读取替换为读取行

(set! varB (read-line))

一切正常。

这意味着,我必须在varB中的新行字符到达varA之前使用它。我说的对吗?它根本不会进入varB。这两个函数都从(当前输入端口)读取,我认为(不确定)它从某个内部缓冲区读取。换行符保留在缓冲区中,可以读取。因此,在设置VarA之前,您需要以某种方式刷新该缓冲区。例如,通过调用(读取行)而不将其设置为变量。