Как прочитать sexp из файла

#string #list #file #common-lisp

#lisp #common-lisp

Вопрос:

Если я напишу файл, используя

 (with-open-file (s "~/example.sexp" :direction :output)
           (write '(1 2 3) :stream s)
           (write '(4 5 6) :stream s)
           (write '(7 8 9) :stream s))
 

Создается файл, содержащий

 (1 2 3)(4 5 6)(7 8 9)
 

Но когда я пытаюсь открыть и прочитать его с помощью

 (setf f (open "~/example.sexp"))
(read :input-stream f)
 

Я получаю сообщение об ошибке «: ВХОДНОЙ ПОТОК не имеет типа STREAM».

 (type-of f)
 

возвращает STREAM::LATIN-1-FILE-STREAM, который выглядит так, как будто он, по крайней мере, близок к тому, что мне нужно. В чем же разница?

Как я могу прочитать списки, которые я записал в файл?

Ответ №1:

У вас неправильные аргументы READ . Это должно быть просто (read f) , а не (read :input-stream f) .

Ответ №2:

Вы также можете использовать with-open-file:

 (with-open-file (s "~/example.sexp")
  (read s))
 

Или даже:

 (with-open-file (*standard-input* "~/example.sexp")
  (read))
 

: ввод — это направление по умолчанию.