1

我正在尝试通过标准输入读取传递给鸡计划脚本的所有行,并将它们放入列表中,但我似乎无法正确确定何时结束输入。另一个测试脚本似乎表明测试(eof-object? results-of-last-read-line-call)是合法的测试,但在下面的示例中,它只是坐在那里无限阅读。

我整理了以下测试脚本。我打电话给它cat some_file.txt | this_script.scm

#! /usr/local/bin/csi -script

(define (read-from-stdin collection line)
  (if (eof-object? line) ; bad test? 
    collection
     (read-from-stdin (cons collection line) read-line)
  ) ; yes, i know atypical formatting. Done so you can see they're all there
)

(for-each print (read-from-stdin '() (read-line)))
4

2 回答 2

2

问题是您在递归调用中传递了该过程。 read-line这会导致测试总是失败(因为过程永远不是eof-object)。相反,您可能想要调用 read-line并传递行字符串:

(define (read-from-stdin collection line)
  (if (eof-object? line) ; the test is fine
      collection
      (read-from-stdin (cons collection line) (read-line))))

(for-each print (read-from-stdin  '() (read-line)))

你也cons用相反的论点打电话,所以我也解决了这个问题。也许这是在反向添加线条的尝试?相反,你可能想在最后反转线条,所以你会得到

(for-each print (reverse (read-from-stdin  '() (read-line))))

或者你当然可以打电话(reverse collection)read-from-stdin

于 2015-09-18T06:32:19.647 回答
-1

我喜欢用read-lines这个。这是您使用它编写的程序:

#!/usr/local/bin/csi -script
(for-each print (read-lines))

测试和工作。对于 csc,将 #!-line 替换为(use extras).

于 2016-02-25T11:35:09.563 回答