9

如何在 Lisp 中读取输入流直到 EOF?在 C 中,你可以这样做:

while ((c = getchar()) != EOF)
{
  // Loop body...
}       

我希望能够将数据通过管道传输到我的 Lisp 程序,而无需提前指定数据大小。这是我现在正在做的事情的一个例子:

(dotimes (i *n*)
  (setf *t* (parse-integer (read-line) :junk-allowed T))
  (if (= (mod *t* *k*) 0) (incf *count*)))

在这个循环中,变量*n*指定了我要传递给程序的行数(该值是从输入的第一行读取的),但我只想处理任意且未知的行数,当它到达时停止流的末端。

4

2 回答 2

15

请参阅READ-LINE的 HyperSpec

(loop for line = (read-line stream nil :eof) ; stream, no error, :eof value
      until (eq line :eof)
      do ... )

或者有时为零

(loop for line = (read-line stream nil nil)
      while line
      do ... )
于 2009-08-21T09:54:04.633 回答
11

read-line接受一个可选参数 ( eof-error-p) 允许它在点击 时返回NIL(默认)或用户指定的值 ( eof-value) EOF,而不是发出错误信号。

来自成功 Lisp 的第 19 章

READ-LINE &optional 流 eof-error-p eof-value recursive-p

在上面列出的读取函数中,可选参数EOF-ERROR-PEOF-VALUE指定当您的程序尝试从耗尽的流中读取时会发生什么。如果EOF-ERROR-P为 true(默认值),则 Lisp 将在尝试读取耗尽的流时发出错误信号。如果EOF-ERROR-P为 NIL,则 Lisp 返回EOF-VALUE(默认NIL)而不是发出错误信号。

您可以将其用作函数的简单终止条件。

于 2009-08-21T09:05:15.870 回答