通过Clojure打印机和阅读器绕过Java类

mik*_*era 5 java printing serialization clojure barcode-scanner

我有一个Java课程Vector2,我想说服与Clojure读者"玩得很好".

(def a (vec2 1 2))
(print-str a)
=> "#<Vector2 [1 2]>"
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望课程以Clojure读者可以阅读的形式打印出来.即我希望以下内容返回true:

(= a (read-string (print-str a)))
Run Code Online (Sandbox Code Playgroud)

实现这种往返能力的最佳方法是什么?

Ank*_*kur 5

您需要为您的班级/类型提供print-dupprint-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))))
Run Code Online (Sandbox Code Playgroud)