2009-08-21 7 views
8

Wie lese ich einen Eingabestrom bis EOF in Lisp? In C, können Sie es wie folgt tun könnte:Wie liest man Eingabe bis EOF in Lisp

while ((c = getchar()) != EOF) 
{ 
    // Loop body... 
}  

I Rohrdaten zu meinem Lisp-Programme in der Lage sein möchten, ohne die Datengröße im Voraus angeben zu müssen. Hier ist ein Beispiel von etwas, was ich jetzt tue:

(dotimes (i *n*) 
    (setf *t* (parse-integer (read-line) :junk-allowed T)) 
    (if (= (mod *t* *k*) 0) (incf *count*))) 

In dieser Schleife wird die Variable *n* gibt die Anzahl der Zeilen, die ich sind Rohrleitungen, um das Programm (der Wert wird von der ersten Zeile der Eingabe lesen), aber ich möchte nur eine willkürliche und unbekannte Anzahl von Zeilen verarbeiten, die am Ende des Streams enden.

Antwort

9

read-line ein optionales Argument (eof-error-p) ermöglicht es entweder NIL (Standard) oder einen vom Benutzer angegebenen Wert (eof-value) beim Auftreffen auf ein EOF anstelle von Signalisierungs einen Fehler zurückzugeben.

Von Chapter 19 of Successful Lisp:

READ-LINE & optional Strom EOF-Fehler-p EOF-Wert rekursive-p

In der Lese oben aufgeführten Funktionen, optionale Argumente EOF-ERROR-P und EOF-VALUE angeben, was passiert, wenn Ihr Programm versucht, aus einem erschöpften Stream zu lesen. Wenn EOF-ERROR-P wahr ist (Standardeinstellung), signalisiert Lisp beim Versuch, einen erschöpften Stream zu lesen, einen Fehler. Wenn EOF-ERROR-P NIL ist, gibt Lisp EOF-VALUE (Standard NIL) zurück, anstatt einen Fehler zu signalisieren.

Sie können dies als einfache Beendigungsbedingung für Ihre Funktion verwenden.

+1

@GustavBertram nicht sicher, was du meinst. Es ist immer noch verfügbar für den Download von dem Link, den ich vor sieben Jahren in dieser Antwort gepostet habe. Ich habe es gerade bestätigt. –

13

Siehe HyperSpec für READ-LINE

(loop for line = (read-line stream nil :eof) ; stream, no error, :eof value 
     until (eq line :eof) 
     do ...) 

oder manchmal mit null

(loop for line = (read-line stream nil nil) 
     while line 
     do ...)