Functional programming 方案(DrRacket)-读取行不';不要在第二次尝试时停止输入
我提示用户将2个值存储在2个不同的变量中,如下所示: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 (
(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之前,您需要以某种方式刷新该缓冲区。例如,通过调用(读取行)而不将其设置为变量。