如何在Lisp中读取输入直到EOF
问题描述:
如何在Lisp中读取输入流直到EOF?在C语言中,你可以做这样的:如何在Lisp中读取输入直到EOF
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*
指定(值从输入的第一行读出),我的配管内的程序行数,但我想只处理任意数量的未知行,并在到达流结尾时停止。
答
read-line
接受一个可选参数(eof-error-p
),从而允许其返回任一NIL
(默认值)或在击中一个EOF
,而不是信令的误差的用户指定的值(eof-value
)。
从Chapter 19 of Successful Lisp:
READ-LINE &可选流EOF错误-P EOF值递归-P
在上面列出的读取功能,可选参数
EOF-ERROR-P
和EOF-VALUE
指定哪些当您的程序尝试从耗尽的流中读取时发生。如果EOF-ERROR-P
为true(默认值),则Lisp将在尝试读取耗尽流时发出错误信号。如果EOF-ERROR-P
为零,则Lisp返回EOF-VALUE
(默认NIL
),而不是发出错误信号。
您可以将此用作函数的简单终止条件。
答
见HyperSpec为READ-LINE
(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 ...)
@GustavBertram不知道你的意思。它仍然可以从我在七年前发布的链接中下载这个答案。我刚刚证实。 – 2017-02-02 22:05:49