В индексе пакета есть библиотека флекса , которая может обрабатывать эти вещи для вас. В этом случае вы будете искать inflection.underscore()
:
>>> inflection.underscore('CamelCase')
'camel_case'
Если вы хотите сериализовать вещи в S-выражения, вы можете использовать print-dup
:
(binding [*print-dup* true] (println [1 2 3]))
; prints [1 2 3]
(defrecord Foo [x])
; => user.Foo
(binding [*print-dup* true] (println (Foo. :foo)))
; prints #=(user.Foo/create {:x :foo})
Обратите внимание, что печать структуры, которая содержит, скажем, десять ссылок на один вектор, с последующим чтением ее обратно дает вам структуру данных с десятью отдельными (не одинаковыми?
), хотя и эквивалентными по структуре (=
) векторами.
Чтобы использовать это в случаях, когда нет реализации по умолчанию, реализуйте мультиметод clojure.core/print-dup
.
Также, многие вещи в Clojure 1.2 являются java.io.Serializable
:
(every? (partial instance? java.io.Serializable)
[{1 2} #{"asdf"} :foo 'foo (fn [] :foo)])
; => true
(defrecord Foo [])
(instance? java.io.Serializable (Foo.))
; => true
Обратите внимание, что вам следует избегать сериализации созданных во время выполнения fn
ов - они являются экземплярами одноразовых классов со странными именами, и вы все равно не сможете десериализовать их после перезапуска JVM. При компиляции AOT, fn
s получают свои собственные фиксированные имена классов.
Обновление: Как упоминалось в комментарии к вопросу, Serializable
лучше всего подходит для краткосрочного хранения/передачи данных, тогда как print-dup
должен быть более надежным решением для долгосрочного хранения (работа во многих версиях приложения, Clojure и т.д.). Причина в том, что print-dup
никак не зависит от структуры сериализуемых классов (так что вектор print-dup
'd сегодня все еще будет читаем, когда реализация вектора перейдет от Java к deftype
Clojure).
edn-формат был выпущен в качестве стандарта для передачи данных с использованием структур данных Clojure.
Это очень хорошо подходит для сериализации структур / значений данных Clojure - и поддерживается на нескольких языках, поэтому также может использоваться в качестве формата обмена данными.
для JSON вы можете использовать стандартный clojure-contrib.json . Хотя, насколько я помню, все объекты Clojure должны быть сериализуемыми ...
Если все является структурой данных Clojure, то она уже сериализована (b / c кода <-> данных). Просто выгружайте структуры данных на диск. Для восстановления загрузите их обратно и (eval).