0

这都是关于方案及其输入系统的,让我们开始吧,我得到了这个输入,程序必须一直读到 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))))

它坚持来回读取输入,在此先感谢

4

2 回答 2

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))))
于 2013-02-03T22:22:05.830 回答
0

为了eof-object?返回 true,如果您从控制台读取,则必须实际发送文件结尾。在 Unix 中,按CtrlD; 在 Windows 中,然后CtrlZEnter

于 2013-02-03T15:58:29.357 回答