Clojure edn для чтения ключевых слов с автоматическими именами

Есть ли способ проинструктировать clojure.core.edn/read как разрешить авто ключевые слова пространства имен?

  (edn/read-string "{:not-namespaced \"ko\" }") ;;=> {:not-namespaced "ko"}
  (edn/read-string "{:namespaced/ok \"ko\" }")  ;;=> #:namespaced{:ok "ko"}
  (edn/read-string "{::namespaced \"ko\" }")    ;;=> Unhandled java.lang.RuntimeException Invalid token: ::namespaced autonamespaced does not work

Последнее исключение имеет смысл, так как "Ключевое слово не может начинаться с::".

Я мог бы использовать load-file с этим простым примером, однако мне также нужна расширяемость edn (читать пользовательские теги).

Наличие параметра, указывающего, как разрешать пространства имен, сделает мои файлы конфигурации (принудительно clojure.spec) гораздо удобочитаемее.

1 ответ

Решение

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

Использование основных функций считывателей тоже сработало бы.

Цитата от Алекса Миллера на расслабленной:

Да, вам понадобятся полные пространства имен в конфигурационных файлах edn. Вы также можете написать спецификации для неквалифицированных ключей с помощью req-un и opt-un

Либо обычный читатель ядра fns, либо читатель clojure.edn fns должен иметь возможность читать помеченные литералы, хотя с # Вам нужно просто связать вызов для настройки считывателей

Мне нравится преобразовывать строку перед ее анализом, чтобы файлы edn оставались чистыми, не считая ключи спецификации неквалифицированными.

(-> "{::namespaced \"ko\" }"
    (#(string/replace % #"::" ":some.namespace/"))
    (edn/read-string))

Это может быть не очень надежным при записи и повторном чтении файлов edn, но хорошо работает с данными конфигурации.

Другие вопросы по тегам