Преобразовать строку LISP в поток - PullRequest
7 голосов
/ 03 октября 2009

У меня есть файл, который выглядит так:

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

Я не знаю заранее, сколько будет строк и столбцов. Я хотел бы прочитать верхнюю строку, которая даст мне знать количество ожидаемых строк. Я нашел функцию lisp (read <stream>), которая в цикле может анализировать каждый из символов как символы. Однако я не нашел способа ограничить цикл только чтением первой строки и остановкой там. Решение, которое я пытаюсь сделать, было бы что-то вроде

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

Проблема в том, что (read-line stream) возвращает строку, которая не может быть проанализирована (read line nil) для извлечения символов (s-выражений).

Как мне преобразовать строку строки в поток или, если возможно, извлечь символы непосредственно из строки?

1 Ответ

6 голосов
/ 03 октября 2009

Вы можете использовать строку в качестве потока, используя макрос with-input-from-string, или использовать read-from-string в цикле. Возможно, вас заинтересует функция read-delimited-list, хотя вам придется добавить какой-нибудь символ-разделитель в конец строки перед ее использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...