Clojure: Как мне превратить код clojure в строку, которая может быть оценена? Это в основном работает, но списки переводятся в raw parens, что не удается - PullRequest
5 голосов
/ 11 февраля 2012

У меня есть простая структура, подобная этой:

(def example {:bbb "bbb" :xxx [1 2 3] :yyy '(3 5 7)})

Если я записываю это в файл, он содержит

{:bbb "bbb" :xxx [1 2 3] :yyy (3 5 7)}

Что в основном верно, но если я загружаю файлна этом он терпит неудачу, потому что он пытается рассматривать 3 как функцию (парены больше не заключаются в кавычки, поэтому пытается оценить как функцию).

Как правильно это сделать?Спасибо!

1 Ответ

9 голосов
/ 11 февраля 2012

Если вы хотите считать данные, ранее записанные в файл Clojure, в виде литерала, вам нужно использовать read или read-string вместо load-file:

(with-open [fd (java.io.PushbackReader.
                (io/reader (io/file "/path/to/file")))]
  (read fd))

Вы можете позвонитьread несколько раз для чтения последовательных форм (конечно, при условии, что вы удерживаете Reader открытым).

Это не требует оценки, за исключением случаев, когда во входном потоке возникает макрос чтения #=в этом случае форма, следующая непосредственно за ней, оценивается во время чтения и заменяется результатом в выводе read (например, (read-string "#=(+ 1 2)") возвращает 3).Чтобы запретить оценку #= префиксных форм, связывайте *read-eval* с false.

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