10

Clojure 1.5.0 では、defrecord で定義された独自のレコード タイプにカスタムの pretty-printer を提供するにはどうすればよいでしょうか。

(defrecord MyRecord [a b])

(defmethod print-method MyRecord [x ^java.io.Writer writer]
  (print-method (:a x) writer))

(defmethod print-dup MyRecord [x ^java.io.Writer writer]
  (print-dup (:a x) writer))

(println (MyRecord. 'a 'b)) ;; a -- OK
(clojure.pprint/pprint (MyRecord. 'a 'b)) ;; {:a a, :b b} -- not OK, I want a

また、cutsom プリンターも使用したいと思いclojure.pprint/pprintます (今では、a説明のためにレコードのフィールドにあるものをきれいに印刷する必要があります)。

4

3 に答える 3

11

clojure.pprintclojure.core名前空間は、印刷機能とは異なるディスパッチ メカニズムを使用します。with-pprint-dispatchをカスタマイズするには、を使用する必要がありますpprint

(clojure.pprint/with-pprint-dispatch print  ;; Make the dispatch to your print function
  (clojure.pprint/pprint (MyRecord. 'a 'b)))

シンプルなディスパッチャーをカスタマイズするには、次のようなものを追加します。

(. clojure.pprint/simple-dispatch addMethod MyRecord pprint-myrecord)
于 2013-03-03T07:27:51.363 に答える
0

理想的ではないかもしれませんが、prとより良いものは見つかりませんでしpr-strた。

REPL セッションの例:

  (ns my-ns)

  (defprotocol Foo
    (bazfn [this]))

  (defrecord Bar [a]
    Foo
    (bazfn [this] 123))


  (pr-str (Bar. "ok")) ;;=> "#my_ns.Bar{:a \"ok\"}"
  (pr (Bar. "ok"))     ;; prints the same as above
于 2015-11-30T13:52:23.080 に答える