2010-09-25 7 views
6

Este es el código para implementar el comando 'cat' con Lisp, como se explica en el libro ANSI Common Lisp, página 122.¿Por qué la línea de lectura se ejecuta dos veces para leer desde un archivo en Lisp?

 
(defun pseudo-cat (file) 
    (with-open-file (str file :direction :input) 
    (do ((line (read-line str nil 'eof) 
       (read-line str nil 'eof))) 
     ((eql line 'eof)) 
     (format t "~A~%" line)))) 

¿Por qué es la función de línea de lectura carrera dos veces? Traté de ejecutarlo con una sola línea de lectura, pero el Lisp no pudo terminar el código.

Respuesta

11

La sintaxis de las variables que lo hago es: variable de inicialización forma, formulario de actualización. En este caso, el formulario de inicialización es el mismo que el formulario de actualización. Pero no hay una abreviatura para ese caso en DO, por lo que debe escribirlo dos veces.

0

Puede probar (listen file) si puede leer el archivo.

Esta es mi función de impresión en archivos

(defun print-file (filename) 
    "Print file on stdout." 
    (with-open-file (file filename :direction :input) 
      (loop 
      (when (not (listen file)) (return)) 
      (write-line (read-line file))))) 
+0

múltiples concats y el uso de formato para crear nuevas cadenas es realmente un desperdicio. No hagas eso. –

+0

Ese es un enfoque equivocado, ya que producirá resultados incorrectos. P.ej. si pasa el nombre de named pipe en linux o windows, probablemente no estará listo inmediatamente para la entrada, por lo tanto, listen devolverá NIL y la función volverá sin copiar nada. –

5

es necesario leer la sintaxis de la DO: http://www.lispworks.com/documentation/HyperSpec/Body/m_do_do.htm

La primera forma LEER-LINE es el init-forma y la segunda es el paso a la forma. Entonces, en la primera iteración, la variable se establece en el resultado de la forma de inicio. En las siguientes iteraciones, la variable se establece en el valor de la forma escalonada.

+0

+1 por proporcionar un enlace –

Cuestiones relacionadas