【问题标题】:What is the "Correct" way to write an EDN file in Clojure as of August 2013?截至 2013 年 8 月,在 Clojure 中编写 EDN 文件的“正确”方式是什么?
【发布时间】:2013-08-27 21:49:08
【问题描述】:

我想从 Clojure 中写出一个 EDN 数据文件作为标记文字。尽管clojure.edn API 包含readread-string,但没有编写器。我熟悉here 报告的问题。基于此,我的理解是 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"})])))

如果您在生产中使用 EDN,您如何写出 EDN 文件?和上面的一样吗?有什么需要我注意的问题吗?

更新

Clojure Cookbook 条目"Emitting Records as EDN Values" 包含对此问题的更详尽解释以及导致有效 EDN 标签的处理方法。

【问题讨论】:

标签: clojure edn


【解决方案1】:

您不需要手动生成标签。如果您使用任何 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-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

我看到的唯一缺点是,如果您的命名空间中有 -,您会失去对标签外观的一些控制,因为 java 类不能包含这些,因此它们会被转换为下划线。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2014-01-04
  • 2022-07-19
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多