5

Vector2私は、Clojure リーダーで「うまくプレイ」するように説得したいJava クラスを持っています。

(def a (vec2 1 2))
(print-str a)
=> "#<Vector2 [1 2]>"

理想的には、Clojure リーダーが読み取れる形式でクラスを出力したいと考えています。つまり、次のものが true を返すようにしたいと思います。

(= a (read-string (print-str a)))

このラウンドトリップ機能を実現する最善の方法は何ですか?

4

1 に答える 1

5

クラス/タイプ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))))
于 2013-02-22T11:15:53.787 に答える