首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从2013年8月开始,用Clojure编写EDN文件的“正确”方法是什么?

从2013年8月开始,用Clojure编写EDN文件的“正确”方法是什么?
EN

Stack Overflow用户
提问于 2013-08-28 05:49:08
回答 1查看 12.1K关注 0票数 18

我想从Clojure中写出一个EDN数据文件作为标记文字。虽然clojure.edn接口包含readread-string,但没有编写器。我对here报告的问题很熟悉。基于此,我的理解是prpr-str函数才是今天要用到的。

我想咨询一下StackOverflow社区,看看下面这样的东西是否被认为是写出EDN文件的“正确”方式:

代码语言:javascript
复制
(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标记的处理方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 23:51:19

您应该不需要手动生成标记。如果您使用任何clojure类型定义机制,它们将由打印机创建。defrecord在这方面特别方便。

代码语言:javascript
复制
(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-strclojure.pprint/pprint。使用Clojure类型创建标记还可以让您免费阅读这些标记。

代码语言:javascript
复制
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类不能包含这些,所以它们会被转换为下划线。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18476049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档