2010-09-25 13 views
6

Questo è il codice per implementare il comando 'cat' con Lisp, come è spiegato nel libro ANSI Common Lisp, pagina 122.Perché la lettura riga viene eseguita due volte per la lettura da un file in 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)))) 

Perché la funzione run lettura-line due volte? Ho provato a eseguirlo con una sola riga di lettura, ma il Lisp non ha potuto terminare il codice.

risposta

11

La sintassi delle variabili fanno è: variabile, sotto forma di inizializzazione, modulo di aggiornamento. In questo caso, il modulo di inizializzazione è lo stesso del modulo di aggiornamento. Ma non c'è una scorciatoia per quel caso in DO, quindi devi scriverlo due volte.

0

È possibile utilizzare (listen file) per il test se è possibile leggere dal file.

Questa è la mia funzione di stampa su file

(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

concattioni multiple e utilizzando il formato per creare nuove stringhe è davvero uno spreco. Non farlo. –

+0

Questo è un approccio sbagliato poiché produrrà risultati errati. Per esempio. se si passa il nome di named pipe in linux o windows, probabilmente non sarà immediatamente pronto per l'input, quindi listen restituirà NIL e la funzione ritornerà senza effettivamente copiare nulla. –

5

è necessario leggere la sintassi di DO: http://www.lispworks.com/documentation/HyperSpec/Body/m_do_do.htm

La prima forma LEGGI-LINE è l'init-forma e il secondo è il passo-modulo. Quindi nella prima iterazione la variabile è impostata sul risultato della forma di init. Nelle iterazioni successive la variabile è impostata sul valore del modulo di passo.

+0

+1 per fornire un collegamento –

Problemi correlati