2009-08-21 9 views
8

Come si legge un flusso di input fino a EOF in Lisp? In C, si potrebbe fare in questo modo:Come leggere l'input fino a EOF in Lisp

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

mi piacerebbe essere in grado di dati di tubi ai miei programmi Lisp senza dover specificare la dimensione dei dati in anticipo. Ecco un esempio da qualcosa che sto facendo ora:

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

In questo ciclo, la variabile *n* specifica il numero di linee di tubazioni Sono al programma (il valore viene letto dalla prima riga di input), ma mi piacerebbe solo elaborare un numero arbitrario e sconosciuto di linee, fermandosi quando raggiunge la fine del flusso.

risposta

9

read-line prende un argomento opzionale (eof-error-p) consentendo di ritorno sia NIL (default) o un valore specificato dall'utente (eof-value) su colpire un EOF, invece di segnalare un errore.

Da Chapter 19 of Successful Lisp:

LEGGI-LINE & flusso opzionale EOF-error-p EOF valore recursive-p

Nelle funzioni di lettura di cui sopra, argomenti opzionali EOF-ERROR-P e EOF-VALUE specificare quali succede quando il tuo programma fa un tentativo di leggere da un flusso esaurito. Se EOF-ERROR-P è true (il valore predefinito), allora Lisp segnalerà un errore al tentativo di leggere un flusso esaurito. Se EOF-ERROR-P è NIL, allora Lisp restituisce EOF-VALUE (valore predefinito NIL) invece di segnalare un errore.

È possibile utilizzare questo come una condizione di terminazione semplice per la vostra funzione.

+1

@GustavBertram Non sei sicuro di quello che vuoi dire. È ancora disponibile per il download dal link che ho postato più di sette anni fa in questa risposta. Ho appena confermato. –

13

Vedere la HyperSpec per READ-LINE

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

o, a volte con nil

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