我想从Clojure写出一个EDN数据文件作为标记文字。虽然clojure.edn API包含read
和read-string
,但没有编写者。我熟悉所报告的问题here。基于此,我的理解是pr
和pr-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"})])))
如果您在制作中使用EDN,您如何写出EDN文件?与上面类似?我需要注意哪些问题?
Clojure Cookbook条目"Emitting Records as EDN Values"包含对此问题的更全面的解释以及处理它的方法,从而产生有效的EDN标记。
答案 0 :(得分: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\"}]"
如果您想要更好地格式化它们,可以合并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
我看到的唯一缺点是,如果你的命名空间中有标签,你会失去对标签外观的控制,因为java类不能包含这些,所以它们会被转换为下划线。