Как я могу использовать \ * print-dup \ * для печати записей в clojure? Простой случай - PullRequest
5 голосов
/ 22 декабря 2010

Я пытаюсь использовать * print-dup *, чтобы разрешить запись данных clojure в файл, а затем прочитать их обратно, однако у меня возникают проблемы даже в этом простом случае.Есть ли что-то, что я делаю не так?Что мне нужно сделать, чтобы заставить это работать?

Clojure 1.3.0-alpha3-SNAPSHOT 
user=> (defrecord TreeNode [val left right]) ;;create the record 
user.TreeNode 
user=> (TreeNode. 5 nil nil) 
#:user.TreeNode{:val 5, :left nil, :right nil} ;; it works just fine 
user=> (binding [*print-dup* true] (prn (TreeNode. 5 nil nil))) ;; use *print-dup* to support reading in and preserving type 
#=(user.TreeNode/create {:val #=(java.lang.Long. "5"), :left nil, :right nil}) ;; this is the form we need to copy paste 
nil 
user=> #=(user.TreeNode/create {:val #=(java.lang.Long. "5"), :left nil, :right nil}) ;;trying to copy and paste 
IllegalArgumentException No matching method found: create 
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:50) ;;we have an error 
user=>

Ответы [ 3 ]

6 голосов
/ 22 декабря 2010

Записи не распечатываются в доступной форме.Мы добавили наш собственный defrecord2, который включает поддержку для создания функций конструктора и поддержку print / pprint для их печати с использованием функции конструктора (которая может быть возвращена в исходную запись).Это более подробно здесь и здесь и код здесь.

Я спросил Рича Хики об этой проблеме в Clojure Conjна конференции в октябре 2010 года, и он сказал, что функции конструктора и поддержка читателей для записей запланированы на будущее.

3 голосов
/ 03 июня 2011

В качестве обновления, начиная с alpha8, в простом случае * print-dup * с записями теперь работает.

 user=> (defrecord TreeNode [val left right])
 user.TreeNode
 user=> (TreeNode. 5 nil nil)
 #user.TreeNode{:val 5, :left nil, :right nil}
 user=> (binding [*print-dup* true] (prn (TreeNode. 5 nil nil)))
 #user.TreeNode[5, nil, nil]
 nil
 user=> #user.TreeNode[5, nil, nil]
 #user.TreeNode{:val 5, :left nil, :right nil}
 user=> 
2 голосов
/ 29 августа 2011

Обход в 1.2:

(defn- extend-print-dup [record-class]
  (defmethod print-dup record-class [o w]
    (.write w "#=(")
    (.write w (.getName ^Class (class o)))
    (.write w ". ")
    (dorun (map (fn [a]  (print-dup a w) (.write w " ")) (vals o)))
    (.write w ")")))

(defrecord Hl7Field [protospec segname fname pos hl7type values])
(extend-print-dup Hl7Field)

=> (def a (Hl7Field. "p" "PV1" "toto" 0 "ST"  ["c" "d"]))
=> (binding [*print-dup* true] (prn a))
#=(higiebus.bus.protocol.hl7.Hl7Field. "p" "PV1" "toto" 0 "ST" ["c" "d"] )

=> #=(higiebus.bus.protocol.hl7.Hl7Field. "p" "PV1" "toto" 0 "ST" ["c" "d"] )
{:protospec "p", :segname "PV1", :fname "toto", :pos 0, :hl7type "ST", :values ["c" "d"]}

Вы можете заключить вызов extension-print-dup в пользовательский макрос defrecord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...