Используя guile 1.8 или guile 2, следующий код читает за EOF, по-видимому, несколько дополнительных строк, а затем останавливается. Эффект, который это имеет в более крупной программе, из которой это является извлечением, состоит в том, чтобы, по-видимому, повредить ранее считанные данные. Я неправильно использую строку чтения или тестирую объект eof?
(use-modules (ice-9 rdelim))
(define f
(lambda (p)
(let loop ((line (read-line p)))
(format #t "line: ~a\n" line)
(if (not (eof-object? (peek-char p)))
(begin
(let ((m (string-match "^[ \t]*#" line)))
(if m
(begin
(format #t "comment: ~a\n" (match:string m))
(loop (read-line p))
)))
(format #t "read next line\n")
(loop (read-line p)))))))
(define main
(lambda ()
(let ((h (open-input-file "test")))
(f h))))
Вот минимальный пример фиктивного входного файла:
1
2
3
# comment line
4
5
1
2
3
# comment line
4
5
1
2
3
# comment line
4
5
Чтобы проблема проявилась, она должна быть больше нескольких строк. Приносим извинения за длину примера кода, но проблема возникает только тогда, когда код достигает такой степени сложности (хотя и небольшой).