如何在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*
指定了我正在为程序输出的行数(该值是从输入的第一行读取的),但我想只处理一个任意的和未知的行数,到达流末尾时停止。
答案 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
在上面列出的读取函数中,可选参数
EOF
和EOF-ERROR-P
指定当程序尝试从耗尽的流中读取时会发生什么。如果EOF-VALUE
为真(默认值),则Lisp将在尝试读取耗尽的流时发出错误信号。如果EOF-ERROR-P
为NIL,则Lisp返回EOF-ERROR-P
(默认EOF-VALUE
),而不是发出错误信号。
您可以将此作为功能的简单终止条件。