Я пытаюсь использовать стандартную сериализацию для кода 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 относительно него.
My _guess_ здесь, что фокус для EDN предназначен для хранения данных, а не «кода». Вместо этого вы можете использовать регулярную 'read-string' (с ее ошибками). Если это помогает в правильном ответе: он отключен здесь: https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/EdnReader.java#L53 – cfrick
Почему бы вам просто не сохранить Clojure введите код в .clj-файл и загрузите его с помощью Clojure? –
См. Мои изменения относительно 'read-string' и' load-file'. –