Guile Scheme read-line 读取过去的 EOF
Guile Scheme read-line reading past EOF
使用 guile 1.8 或 guile 2,以下代码读取了 EOF,似乎多了几行,然后停止。这在更大的程序(这是其中的一个摘录)中产生的影响似乎是破坏了以前读取的数据。我是否错误地使用了 read-line 或测试了 eof-object?
(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
需要超过几行才能显示问题。对代码示例的长度表示歉意,但只有当代码达到这种复杂程度(尽管很小)时才会出现问题。
我建议重写该过程,它似乎不是读取文件并遍历其行的正确方法。请试试这个:
(define (f)
(let loop ((line (read-line)))
(if (not (eof-object? line))
(begin
(format #t "line: ~a\n" line)
(let ((m (string-match "^[ \t]*#" line)))
(if m (format #t "comment: ~a\n" line)))
(format #t "read next line\n")
(loop (read-line))))))
(define (main)
(with-input-from-file "test" f))
使用您的示例输入,调用 (main)
会在控制台上打印以下输出,希望这是您所期望的:
line: 1
read next line
line: 2
read next line
line: 3
read next line
line: # comment line
comment: # comment line
read next line
line: 4
read next line
line: 5
read next line
line: 1
read next line
line: 2
read next line
line: 3
read next line
line: # comment line
comment: # comment line
read next line
line: 4
read next line
line: 5
read next line
line: 1
read next line
line: 2
read next line
line: 3
read next line
line: # comment line
comment: # comment line
read next line
line: 4
read next line
line: 5
read next line
使用 guile 1.8 或 guile 2,以下代码读取了 EOF,似乎多了几行,然后停止。这在更大的程序(这是其中的一个摘录)中产生的影响似乎是破坏了以前读取的数据。我是否错误地使用了 read-line 或测试了 eof-object?
(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
需要超过几行才能显示问题。对代码示例的长度表示歉意,但只有当代码达到这种复杂程度(尽管很小)时才会出现问题。
我建议重写该过程,它似乎不是读取文件并遍历其行的正确方法。请试试这个:
(define (f)
(let loop ((line (read-line)))
(if (not (eof-object? line))
(begin
(format #t "line: ~a\n" line)
(let ((m (string-match "^[ \t]*#" line)))
(if m (format #t "comment: ~a\n" line)))
(format #t "read next line\n")
(loop (read-line))))))
(define (main)
(with-input-from-file "test" f))
使用您的示例输入,调用 (main)
会在控制台上打印以下输出,希望这是您所期望的:
line: 1
read next line
line: 2
read next line
line: 3
read next line
line: # comment line
comment: # comment line
read next line
line: 4
read next line
line: 5
read next line
line: 1
read next line
line: 2
read next line
line: 3
read next line
line: # comment line
comment: # comment line
read next line
line: 4
read next line
line: 5
read next line
line: 1
read next line
line: 2
read next line
line: 3
read next line
line: # comment line
comment: # comment line
read next line
line: 4
read next line
line: 5
read next line