如何在Lisp中读取输入直到EOF

时间:2009-08-21 08:46:00

标签: lisp common-lisp eof

如何在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*指定了我正在为程序输出的行数(该值是从输入的第一行读取的),但我想只处理一个任意的和未知的行数,到达流末尾时停止。

2 个答案:

答案 0 :(得分:13)

请参阅HyperSpec READ-LINE

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

或有时与nil

(loop for line = (read-line stream nil nil)
      while line
      do ... )

答案 1 :(得分:10)

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

来自Chapter 19 of Successful Lisp

  

READ-LINE &可选流eof-error-p eof-value recursive -p

     

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

您可以将此作为功能的简单终止条件。