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

Fre*_*chi 8 lisp common-lisp eof

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

while ((c = getchar()) != EOF)
{
  // Loop body...
}       
Run Code Online (Sandbox Code Playgroud)

我希望能够将数据传输到我的Lisp程序,而无需事先指定数据大小.这是我现在正在做的一个例子:

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

在这个循环中,变量*n*指定了我输出到程序的行数(从第一行输入读取的值),但我想只处理一个任意和未知数量的行,当它到达时停止流的结尾.

Rai*_*wig 14

请参阅HyperSpec for READ-LINE

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

或者有时候没有

(loop for line = (read-line stream nil nil)
      while line
      do ... )
Run Code Online (Sandbox Code Playgroud)


ire*_*ses 10

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

成功Lisp的第19章开始:

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

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

您可以将此作为函数的简单终止条件.