2009-10-03 22 views
7

Mam plik, który wygląda tak:Konwersja Lisp ciąg strumienia

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 

nie wiem z wyprzedzeniem jak wiele wierszy i kolumn nie będzie. Chciałbym przeczytać górną linię, która poinformuje mnie o liczbie wierszy, jakich można się spodziewać. Znalazłem funkcję (read <stream>) Lispa, która w pętli może analizować każdy ze znaków jako symbole. Nie znalazłem jednak sposobu na ograniczenie pętli tylko do czytania pierwszej linii i zatrzymywania się tam. Rozwiązanie próbuję uczynić pracę byłoby coś

(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)))) 

Problem polega na tym, że (read-line stream) zwraca ciąg znaków, które nie mogą być analizowane przez (read line nil) wyodrębnić symboli (S-wyrażeń).

Jak mogę przekonwertować linię ciągu na strumień lub, jeśli to możliwe, wyodrębnić symbole bezpośrednio z ciągu znaków?

Odpowiedz

6

Możesz użyć łańcucha jako strumienia za pomocą makra with-input-from-string lub użyć read-from-string w pętli. Możesz być także zainteresowany funkcją read-delimited-list, chociaż musisz dodać jakiś znak ogranicznika na końcu ciągu przed jego użyciem.

+0

Skończyło się na tym, że używano read-from-string. Funkcja listy ograniczonej do odczytu wygląda na użyteczną, ale nie całkiem przywykłam do czytania dokumentacji LISP, więc nie jestem do końca pewna, jak z niej korzystać. Dzięki! – royvandewater