схема входного порта 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))))

Он придерживается чтения ввода назад и вперед, заранее спасибо


person Diego Jimeno    schedule 03.02.2013    source источник


Ответы (2)


Чтобы eof-object? вернул истину, вы должны фактически отправить конец файла, если вы читаете с консоли. В Unix нажмите Ctrl D; в Windows нажмите Ctrl Z, затем Enter.

person Chris Jester-Young    schedule 03.02.2013
comment
Я знал это, но мне это нужно, чтобы после нажатия вступления ввод должен заканчиваться и возвращать результат, я попробовал (eq? Read # \ newline) вместо (not (eof-object? Port) ), но все равно не работает - person Diego Jimeno; 03.02.2013
comment
Если вы используете read, единственный способ получить #\newline - это ввести #\newline буквально во вводе. :-) Но если вы используете read-char, он будет работать так, как вы ожидаете, но вы должны использовать peek-char, чтобы, если это не новая строка, вы могли прочитать следующее выражение, не съедая первый символ! Кроме того, не используйте eq? для сравнения символов: используйте eqv?. Итак, всего: (eqv? (peek-char) #\newline). - person Chris Jester-Young; 03.02.2013

В функции, показанной в вопросе, вы проверяете (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))))
person Terje D.    schedule 03.02.2013