关于方案及其输入系统的所有内容,让我们开始吧,我得到了这个输入,程序必须继续阅读直到eof。
]=> (getallinput)
22 (5(4(11(7()())(2()()))()) (8(13()())(4()(1()()))))
20 (5(4(11(7()())(2()()))()) (8(13()())(4()(1()()))))
这就是功能
(define (getAllinput)
(let ((port console-i/o-port))
(letrec ((nread (lambda (port)
(let ((value (read port)))
(let ((tree (read port)))
(display (findValor (sum tree) value))
(if (not (eof-object? port))
(nread port)))))))
(nread port))))
问题是,我在最后阅读控制台时遇到了问题,而letrec,我知道问题出在哪里,我不知道如何解决它。
(if (not (eof-object? tree)) (nread port)))))))(nread port))))
它提前来回阅读输入
答案 0 :(得分:0)
为了使eof-object?
返回true,如果您正在从控制台读取,则必须实际发送文件结尾。在Unix中,按 Ctrl D ;在Windows中,按 Ctrl Z 然后输入。
答案 1 :(得分:0)
在问题中显示的功能中,您正在检查(eof-object? port)
哪个永远不会成为现实,而您应该检查(eof-object? tree)
,如您问题中所示,或(eof-object? value)
此外,在使用findValor
函数中的读取值之前,应检查此条件:
(define (getAllinput)
(let ((port console-i/o-port))
(letrec ((nread (lambda (port)
(let* ((value (read port))
(tree (read port)))
(if (not (eof-object? value)) ; <--
(begin
(display (findValor (sum tree) value))
(nread port)))))))
(nread port))))