我正在尝试使用* 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=>
答案 0 :(得分:6)
记录不以可评估的形式打印。我们添加了自己的defrecord2,其中包括支持创建构造函数和print / pprint支持,以使用构造函数(可以将其重新计入原始记录)进行打印。这个文档更多here和here,而code就在这里。
我在2010年10月的Clojure Conj会议上向Rich Hickey询问了这个问题,他说未来计划构建函数和读者对记录的支持。
答案 1 :(得分:3)
作为更新,从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 :(得分:2)
在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"]}
您可以在自定义defrecord宏中包含对extend-print-dup的调用。