2009-08-21 13 views
8

¿Cómo leo una secuencia de entrada hasta EOF en Lisp? En C, es posible hacerlo de esta manera:Cómo leer la entrada hasta EOF en Lisp

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

Me gustaría ser capaz de datos del tubo a mis programas Lisp sin tener que especificar el tamaño de los datos con antelación. He aquí un ejemplo de algo que estoy haciendo ahora:

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

En este bucle, la variable *n* especifica el número de líneas de tuberías estoy en el programa (el valor se lee de la primera línea de entrada), pero me gustaría procesar un número arbitrario y desconocido de líneas, deteniéndome cuando llegue al final de la transmisión.

Respuesta

9

read-line toma un argumento opcional (eof-error-p) que permite que vuelva ya sea NIL (por defecto) o un valor especificado por el usuario (eof-value) en lanzó un EOF, en lugar de señalización de un error.

De Chapter 19 of Successful Lisp:

LEER-LINE & corriente opcional EF-error-p EF-valor recursivo-p

En las funciones de lectura mencionados anteriormente, los argumentos opcionales EOF-ERROR-P y EOF-VALUE especificar qué sucede cuando su programa hace un intento de leer de un flujo agotado. Si EOF-ERROR-P es verdadero (el valor predeterminado), entonces Lisp señalará un error cuando intente leer un flujo agotado. Si EOF-ERROR-P es NIL, entonces Lisp devuelve EOF-VALUE (predeterminado NIL) en lugar de indicar un error.

Puede usar esto como una condición de terminación simple para su función.

+1

@GustavBertram No está seguro de lo que quiere decir. Todavía está disponible para su descarga desde el enlace que publiqué hace más de siete años en esta respuesta. Acabo de confirmar. –

13

Véase el hyperspec para READ-LINE

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

o, a veces con nula

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