2013-08-27 2 views
7

Я хотел бы записать файл данных EDN от Clojure в виде помеченных литералов. Хотя API clojure.edn содержит read и read-string, нет писателей. Я знаком с сообщением о проблеме here. Исходя из этого, я понимаю, что функции pr и pr-str предназначены для использования сегодня.Что такое «Правильный» способ записи EDN-файла в Clojure по состоянию на август 2013 года?

Я хотел проверить с сообществом StackOverflow, чтобы увидеть, если что-то вроде следующего будет считаться «правильный» способ записи из файла EDN:

(spit "friends.edn" (apply str 
    (interpose "\n\n" 
      [(pr-str (symbol "#address-book/person") {:name "Janet Wood"}) 
       (pr-str (symbol "#address-book/person") {:name "Jack Tripper"}) 
       (pr-str (symbol "#address-book/person") {:name "Chrissy Snow"})]))) 

Если вы используете EDN в производстве, как вы пишете файл EDN? Как и выше? Есть ли какие-то проблемы, которые мне нужно искать?

Update

Запись Clojure Cookbook, "Emitting Records as EDN Values" содержит более подробное объяснение этого вопроса и способы обработки его, что приведет к правильным тегам EDN.

+0

Проверьте https://github.com/xsc/rewrite-clj – devth

ответ

9

Вам не нужно создавать метки вручную. Если вы используете какой-либо механизм определения типа clojure, они будут созданы принтером. defrecord особенно удобен для этого.

(ns address-book) 
(defrecord person [name]) 

(def people [(person. "Janet Wood") 
      (person. "Jack Tripper") 
      (person. "Chrissy Snow")]) 

address-book> (pr-str people) 
"[#address_book.person{:name \"Janet Wood\"} 
    #address_book.person{:name \"Jack Tripper\"} 
    #address_book.person{:name \"Chrissy Snow\"}]" 

, если вы хотите, чтобы они отформатированы симпатичнее вы можете комбинировать with-out-str и clojure.pprint/pprint. Использование типов Clojure для создания тегов также дает вам возможность читать эти теги бесплатно.

address-book> (read-string (pr-str people)) 
[#address_book.person{:name "Janet Wood"} 
#address_book.person{:name "Jack Tripper"} 
#address_book.person{:name "Chrissy Snow"}] 

address-book> (def read-people (read-string (pr-str people))) 
#'address-book/read-people 

address-book> (type (first read-people)) 
address_book.person 

Единственный недостаток я вижу в том, что вы теряете некоторый контроль над тем, как теги выглядеть, если у вас есть -'s в пространстве имен, потому что классы Java не могут содержать их так, что они преобразуются в символы подчеркивания.

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

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