2013 年 8 月現在、Clojure で EDN ファイルを書き込む「正しい」方法は何ですか? 質問する

2013 年 8 月現在、Clojure で EDN ファイルを書き込む「正しい」方法は何ですか? 質問する

ClojureからEDNデータファイルをタグ付きリテラルとして書き出したいのですが、クロージャAPIにはreadと が含まれておりread-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"})])))

EDN を本番環境で使用している場合、EDN ファイルをどのように書き出すのでしょうか? 上記と同様ですか? 注意すべき問題はありますか?

アップデート

Clojureクックブックのエントリ、「レコードを EDN 値として出力する」この問題のより詳細な説明と、有効な 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-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 クラスにはこれらを含めることができず、アンダースコアに変換されるため、タグの外観を制御できなくなることです。

おすすめ記事