Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme Guile方案读取线读取超过EOF_Scheme_Guile - Fatal编程技术网

Scheme Guile方案读取线读取超过EOF

Scheme Guile方案读取线读取超过EOF,scheme,guile,Scheme,Guile,使用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-

使用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

它需要超过几行才能显示问题。对于代码示例的长度,我深表歉意,但问题只有在代码达到如此复杂的程度(尽管很小)时才会出现。

我建议重写该过程,读取文件并在其行上循环似乎不是正确的方法。请试试这个:

(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

我建议重写这个过程,它似乎不是读取文件并在其行上循环的正确方法。请试试这个:

(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没有时间和除非。当然,人们可以编写它们,或者使用其他逻辑。@andro我不知道。在那里,它是固定的。除此之外,这对你有用吗?那块碎片很好用。但问题似乎更加微妙。我正在做的是编写一个小型解析器,它检查行的模式匹配,对匹配进行一些计算,然后我想获得下一行,我试图通过再次调用循环来实现这一点,使用read line读取输入提供的循环值。换句话说,是一种“下一步”控制形式。当我添加许多这样的语句时,scheme的行为是不可预测的。是不是一个人不能以这种方式跳出一个循环并返回到下一个迭代?很难猜测你真正需要什么。方案中并没有“下一步”,但你们让它听起来好像一个if/else就足够了。如果有一个匹配的进程,那么它什么也不做——不管是哪种方式,循环到下一行。我很确定,您所需要的可以使用标准的控制流操作和递归进行管理,但是如果没有更多的上下文,就不可能知道。目前,我认为你最初的问题已经得到了回答。如果你有进一步的困难,请考虑发布一个新问题。我认为我的回答已经可以接受;)令人惊讶的是,Guile1.8没有时间和除非。当然,人们可以编写它们,或者使用其他逻辑。@andro我不知道。在那里,它是固定的。除此之外,这对你有用吗?那块碎片很好用。但问题似乎更加微妙。我正在做的是编写一个小型解析器,它检查行的模式匹配,对匹配进行一些计算,然后我想获得下一行,我试图通过再次调用循环来实现这一点,使用read line读取输入提供的循环值。换句话说,是一种“下一步”控制形式。当我添加许多这样的语句时,scheme的行为是不可预测的。是不是一个人不能以这种方式跳出一个循环并返回到下一个迭代?很难猜测你真正需要什么。方案中并没有“下一步”,但你们让它听起来好像一个if/else就足够了。如果有一个匹配的进程,那么它什么也不做——不管是哪种方式,循环到下一行。我很确定,您所需要的可以使用标准的控制流操作和递归进行管理,但是如果没有更多的上下文,就不可能知道。目前,我认为你最初的问题已经得到了回答。如果你有进一步的困难,请考虑发布一个新问题。我认为我的回答已经可以接受;)