clojure.edn
по умолчанию используют только считыватели данных, хранящиеся в clojure.core/default-data-readers
, который, начиная с Clojure 1.5.1, предоставляет считыватели для мгновенных литералов и литералов UUID. Если вы хотите использовать настраиваемые считыватели, вы можете сделать это, передав параметр :readers
; в частности, вы можете пройти в *data-readers*
. Это задокументировано в строке документации для clojure.edn/read
(строка документации для clojure.edn/read-string
относится к строке документации для read
).
Вот некоторые примеры:
(require '[clojure.edn :as edn])
;; instant literals work out of the box:
(edn/read-string "#inst \"2013-06-08T01:00:00Z\"")
;= #inst "2013-06-08T01:00:00.000-00:00"
;; custom literals can be passed in in the opts map:
(edn/read-string {:readers {'foo identity}} "#foo :asdf")
;= :asdf
;; use current binding of *data-readers*
(edn/read-string {:readers *data-readers*} "...")
(Следующий раздел добавлен в ответ на комментарии Richard Möhn в эта ветка комментариев GitHub. Непосредственный вопрос заключается в том, уместно ли функции чтения вызывать eval
в данные переданы. Я не связан с рассматриваемым проектом; подробности см. в билете, а также в комментариях Ричарда к данному ответу.)
Стоит добавить, что *data-readers*
неявно заполняется из любых файлов data_readers.{clj,cljc}
, которые Clojure находит в корне пути к классам во время запуска. Это может быть удобно (позволяет использовать настраиваемые помеченные литералы в исходном коде Clojure и в REPL), но это означает, что там могут появиться новые считыватели данных с изменением одной зависимости. Использование явно сконструированной карты чтения с clojure.edn
— это простой способ избежать неожиданностей (которые могут быть особенно неприятными при работе с ненадежными входными данными).
(Обратите внимание, что неявный процесс загрузки не приводит к немедленной загрузке какого-либо кода или даже при первом обнаружении тега, упомянутого в *data-readers*
; процесс, который заполняет *data-readers*
, создает пустые пространства имен с несвязанными Vars в качестве заполнителей, и для фактического использования этих считывателей все еще необходимо require
соответствующие пространства имен в пользовательском коде.)
person
Michał Marczyk
schedule
07.06.2013