2017-02-19 6 views
4

Я пытаюсь использовать стандартную сериализацию для кода Clojure, который будет игнорировать пробелы, комментарии и т. Д. Я думал об использовании для этого EDN.Сериализация и де-сериализация кода Clojure как EDN

Согласно тому, что я читал, стандартный способ сериализации s-выражений для EDN составляет pr-str, что, по-видимому, прекрасно работает с большинством конструкций Clojure. Однако, похоже, это не так хорошо работает для кода, содержащего регулярные выражения (используя макрос чтения хеш-строк, например #"\d+").

user=> (pr-str '#"\d") 
"#\"\\d\"" 

user=> (edn/read-string (pr-str '#"\d")) 

RuntimeException No dispatch macro for: " Clojure.lang.Util.runtimeException (Util.java:221) 

Я использую Clojure 1.8.0.

Любые предложения?

Спасибо!

EDIT: Спасибо за ваши ответы и комментарии. Причина, по которой я хотел использовать EDN для начала, заключалась в том, что я хочу обрабатывать ненадежный код.

Идея состоит в том, что я хочу прочитать этот код (любой синтаксически допустимый код Clojure), а затем передать его через специальный статический анализ, чтобы убедиться, что он соответствует определенному подмножеству Clojure, который я считаю «безопасным », и только если он будет соответствовать, я бы счел безопасным выполнение этого кода. По этой причине я хочу избежать load-file, который сразу же загружает файл, а также, возможно, read-string, из-за these warnings относительно него.

+2

My _guess_ здесь, что фокус для EDN предназначен для хранения данных, а не «кода». Вместо этого вы можете использовать регулярную 'read-string' (с ее ошибками). Если это помогает в правильном ответе: он отключен здесь: https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/EdnReader.java#L53 – cfrick

+1

Почему бы вам просто не сохранить Clojure введите код в .clj-файл и загрузите его с помощью Clojure? –

+0

См. Мои изменения относительно 'read-string' и' load-file'. –

ответ

0

Clojure - это надмножество EDN, поэтому не все функции Clojure поддерживаются. Выходной сигнал pr-str является действительной программой Clojure, которая была экранирована, чтобы соответствовать String. RuntimeException жалуется на первый сбежавший ", который не поддерживается макросом чтения EDN #.

(clojure.core/read-string (pr-str #"\d")) ;=> #"\d" 
+0

См. Мои изменения относительно использования 'read-string' –

+0

Возможно, используйте tools.reader? https://github.com/clojure/tools.reader – Jeremy

 Смежные вопросы

  • Нет связанных вопросов^_^