2009-08-21 29 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 ...)