方案输入端口eof

时间:2013-02-03 13:17:19

标签: scheme mit-scheme

关于方案及其输入系统的所有内容,让我们开始吧,我得到了这个输入,程序必须继续阅读直到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))))

它提前来回阅读输入

2 个答案:

答案 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))))