2013-08-27 9 views
7

Chciałbym napisać plik danych EDN z Clojure jako oznaczone literały. Chociaż interfejs API clojure.edn zawiera read i read-string, nie ma pisarzy. Znam problem zgłoszony here. Na tej podstawie rozumiem, że funkcje, które mają być używane dzisiaj, są dostępne w postaci funkcji pr i pr-str.Jaki jest "prawidłowy" sposób zapisu pliku EDN w Clojure od sierpnia 2013 r.?

Chciałem sprawdzić ze społecznością StackOverflow aby zobaczyć, czy coś jak poniżej będą uważane za „prawidłowy” sposób rozpisać plik 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"})]))) 

Jeśli używasz EDN w produkcji, jak wypiszesz plik EDN? Podobne do powyższych? Czy są jakieś problemy, na które muszę zwrócić uwagę?

Aktualizacja

Wpis Clojure Cookbook, "Emitting Records as EDN Values" zawiera dokładniejsze wyjaśnienie tego problemu i sposobów jego skutkującym ważnych tagów EDN uchwytem.

+0

Sprawdź https://github.com/xsc/rewrite-clj – devth

Odpowiedz

9

nie trzeba generować tagów ręcznie. Jeśli użyjesz dowolnego mechanizmu definicji typu clojure, zostaną one utworzone przez drukarkę. defrecord jest szczególnie wygodny do tego.

(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\"}]" 

jeśli chcesz je ładnie sformatowany więcej można połączyć with-out-str i clojure.pprint/pprint. Używanie typów Clojure do tworzenia tagów daje także możliwość bezpłatnego czytania tych tagów.

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 

Jedynym minusem jest to, że widzę tracisz pewną kontrolę nad sposobem tagi wyglądają jeśli masz -'s w przestrzeni nazw, ponieważ klas Java nie może zawierać te więc zamieniony na podkreślenia.

Powiązane problemy