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,而不是发出错误信号.
READ-LINE 和可选流eof-error-p eof-value recursive-p
在上面列出的读取函数中,可选参数
EOF-ERROR-P和EOF-VALUE指定当程序尝试从耗尽的流中读取时会发生什么.如果EOF-ERROR-P为true(默认值),那么Lisp将在尝试读取耗尽的流时发出错误信号.如果EOF-ERROR-P是NIL,则Lisp返回EOF-VALUE(默认NIL)而不是发出错误信号.
您可以将此作为函数的简单终止条件.