2009-08-21 28 views
8

如何在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*指定(值从输入的第一行读出),我的配管内的程序行数,但我想只处理任意数量的未知行,并在到达流结尾时停止。

回答

9

read-line接受一个可选参数(eof-error-p),从而允许其返回任一NIL(默认值)或在击中一个EOF,而不是信令的误差的用户指定的值(eof-value)。

Chapter 19 of Successful Lisp

READ-LINE &可选流EOF错误-P EOF值递归-P

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

您可以将此用作函数的简单终止条件。

+1

@GustavBertram不知道你的意思。它仍然可以从我在七年前发布的链接中下载这个答案。我刚刚证实。 – 2017-02-02 22:05:49

13

见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 ...)