2013-08-27 89 views
7

Tôi muốn viết ra một tệp dữ liệu EDN từ Clojure dưới dạng các ký hiệu được gắn thẻ. Mặc dù API clojure.edn chứa readread-string, không có nhà văn nào. Tôi đã quen với sự cố được báo cáo here. Dựa trên đó, đó là sự hiểu biết của tôi rằng các chức năng prpr-str là những gì có nghĩa là để được sử dụng ngày hôm nay.Cách "Đúng" để viết một tệp EDN ở Clojure vào tháng 8 năm 2013 là gì?

tôi muốn kiểm tra với cộng đồng StackOverflow để xem nếu một cái gì đó như sau đây sẽ được coi là "đúng" cách để viết ra một tập tin 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"})]))) 

Nếu bạn đang sử dụng EDN trong sản xuất, làm thế nào bạn có viết một tệp EDN không? Tương tự như trên? Có bất kỳ vấn đề nào tôi cần tìm kiếm không?

Cập nhật

Mục Clojure Cookbook, "Emitting Records as EDN Values" chứa một lời giải thích kỹ hơn về vấn đề này và cách để xử lý nó dẫn đến thẻ EDN hợp lệ.

+0

Khám phá https://github.com/xsc/rewrite-clj – devth

Trả lời

9

bạn không cần tạo thẻ theo cách thủ công. Nếu bạn sử dụng bất kỳ cơ chế định nghĩa kiểu clojure nào thì chúng sẽ được tạo bởi máy in. defrecord đặc biệt thuận tiện cho việc này.

(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\"}]" 

nếu bạn muốn chúng được định dạng độc đáo hơn, bạn có thể kết hợp with-out-strclojure.pprint/pprint. Sử dụng các loại Clojure để tạo các thẻ cũng cho phép bạn đọc các thẻ đó miễn phí.

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 

Nhược điểm duy nhất tôi thấy là bạn mất một số quyền kiểm soát cách các thẻ tìm kiếm nếu bạn có -'s trong không gian tên của bạn bởi vì các lớp học java không thể chứa những cái họ được chuyển đổi để gạch dưới.