2013-03-02 9 views
6

In Clojure 1.5.0, wie kann ich einen benutzerdefinierten Pretty-Drucker für meine eigenen Datensatztyp, definiert mit Defrecord.Pretty-Drucken eines Datensatzes mit einer benutzerdefinierten Methode in Clojure

(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 

Ich würde clojure.pprint/pprint mag auch meine cutsom Drucker verwenden (die nun, sollte nur ziemlich Abdrücken, was auf dem Gebiet ist a der Aufzeichnung zu Veranschaulichungszwecken).

Antwort

8

clojure.pprint Namespace verwendet verschiedene Versandmechanismus dann die clojure.core Druckfunktionen. Sie müssen with-pprint-dispatch verwenden, um den pprint anzupassen.

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

den einfachen Dispatcher anzufertigen, fügen etwas wie:

(. clojure.pprint/simple-dispatch addMethod MyRecord pprint-myrecord) 
+0

Gerade diese verlassen hier, weil das ist, warum ich hier ankam: die 'pprint-myrecord' Funktion' * out * schreiben sollte ', nicht einen String zurück. – pascal

0

Vielleicht ideal nicht, aber ich habe nicht besser als pr und pr-str gefunden.

Beispiel REPL Sitzung:

(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