我有一个 Java 类 Vector2
,我想说服它与 Clojure 读者“玩得开心”。
(def a (vec2 1 2))
(print-str a)
=> "#<Vector2 [1 2]>"
理想情况下,我希望类以 Clojure 读者可以阅读的形式打印出来。即我希望以下内容返回 true:
(= a (read-string (print-str a)))
实现这种往返能力的最佳方式是什么?
最佳答案
您需要为您的类/类型提供print-dup
和print-method
多方法。
查看 core.clj
例如:
(import 'java.util.Hashtable)
(defmethod print-method Hashtable [x writer]
(binding [*out* writer]
(print (let [h (gensym)]
`(let [~h (Hashtable.)]
~@(map (fn [i]
`(.put ~h ~(str "\"" (.getKey i) "\"") ~(.getValue i) ) ) x) ~h))) ))
(def a (Hashtable.))
(.put a "a" 1)
(.put a "b" 2)
(= a (eval (read-string (print-str a))))
关于java - 通过 Clojure 打印机和阅读器往返 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15022512/