Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert a lisp string to stream

I have a file that looks like this:

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

I don't know ahead of time how many rows and columns there will be. I would like to read the top line, which will let me know the number of rows to expect . I found lisp's (read <stream>) function which, in a loop, can parse each of the characters as symbols. I have not found a way, however, to limit the loop to only reading the first line and stopping there. The solution I'm trying to make work would be something like

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

The problem with this is that (read-line stream) returns a string which cannot be parsed by (read line nil) to extract the symbols (s-expressions).

How can I either convert the string line to a stream, or, if possible, extract the symbols directly from the string?

like image 266
royvandewater Avatar asked Oct 03 '09 17:10

royvandewater


1 Answers

You can either use the string as a stream by using the with-input-from-string macro, or use read-from-string in a loop. You may also be interested in the read-delimited-list function, although you would have to add some kind of delimiter character to the end of the string before using it.

like image 167
Matthias Benkard Avatar answered Sep 20 '22 06:09

Matthias Benkard