截至2013年8月,在Clojure中编写EDN文件的"正确"方法是什么?

mok*_*efe 11 clojure edn

我想写一个来自Clojure的EDN数据文件作为标记文字.虽然clojure.edn API包含readread-string,但没有编写者.我熟悉这里报道的问题.基于此,我的理解是,这些prpr-str功能是今天要使用的.

我想查看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"})])))
Run Code Online (Sandbox Code Playgroud)

如果您在生产中使用EDN,您如何写出EDN文件?与上面类似?我需要注意哪些问题?

更新

Clojure Cookbook条目"将记录作为EDN值发布"包含对此问题的更全面解释以及处理它的方法,从而产生有效的EDN标记.

Art*_*ldt 10

您不需要手动生成标签.如果您使用任何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\"}]"
Run Code Online (Sandbox Code Playgroud)

如果你想要它们更好地格式化你可以结合with-out-strclojure.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
Run Code Online (Sandbox Code Playgroud)

我看到的唯一的缺点是你失去对道路的标签看一些控制,如果你有-'s在您的命名空间,因为Java类可以不包含这些使他们获得转换为下划线.