如何使用\*print-dup\*在clojure中打印记录?一个简单的案例

bmi*_*are 5 serialization clojure

我正在尝试使用*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=>
Run Code Online (Sandbox Code Playgroud)

Ale*_*ler 6

记录不以可评估的形式打印.我们添加了我们自己的defrecord2,其中包括支持创建构造函数和print/pprint支持,以使用构造函数(可以将其重新计入原始记录)进行打印.这是在这里这里更多的文档,代码在这里.

我在2010年10月的Clojure Conj会议上向Rich Hickey询问了这个问题,他说未来计划构建函数和读者对记录的支持.


bmi*_*are 4

作为更新,从 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=> 
Run Code Online (Sandbox Code Playgroud)