2009-10-03 14 views
7

Ho un file che assomiglia a questo:convertire una stringa Lisp per lo streaming

A B C D E 
0 8 6 12 5 
8 0 10 8 9 
6 10 0 7 11 
12 8 7 0 6 
5 9 11 6 0 

non so in anticipo il numero di righe e colonne ci sarà. Vorrei leggere la riga superiore, che mi consentirà di conoscere il numero di righe da prevedere. Ho trovato la funzione (read <stream>) del lisp che, in un ciclo, può analizzare ognuno dei caratteri come simboli. Tuttavia, non ho trovato un modo per limitare il ciclo alla sola lettura della prima riga e alla sua interruzione. La soluzione che sto cercando di fare il lavoro sarebbe qualcosa di simile

(with-open-file (stream "/home/doppler/tmp/testcase1.txt") 
    (setf line (read-line stream)) 
    (when line 
    (loop for symbol = (read line nil) 
     while symbol do (print symbol)))) 

Il problema di questo è che (read-line stream) restituisce una stringa che non può essere analizzato da (read line nil) per estrarre i simboli (S-espressioni).

Come posso convertire la linea della stringa in uno stream o, se possibile, estrarre i simboli direttamente dalla stringa?

risposta

6

È possibile utilizzare la stringa come flusso utilizzando la macro with-input-from-string oppure utilizzare read-from-string in un ciclo. Potresti anche essere interessato alla funzione read-delimited-list, anche se dovresti aggiungere qualche tipo di carattere delimitatore alla fine della stringa prima di usarla.

+0

Ho finito per usare il read-from-string. La funzione read-delimited-list sembra utile, ma non mi sono ancora abituato a leggere la documentazione LISP e quindi non sono abbastanza sicuro di come usarlo. Grazie! – royvandewater

Problemi correlati