2017-09-08 18 views
1

大きな地図や他のものがたくさんあるアプリケーションがあり、印刷時に読みにくいので、カスタム印刷機能を作ってprint-methodと呼んでください:私は、マップは、特別な治療を必要とする種類のものではないと判断した場合、私は通常の印刷メソッドを呼び出すことができますどのように印刷方法をバイパスする方法

fstr1インサイド
(defmethod print-method clojure.lang.PersistentArrayMap [v ^java.io.Writer w] 
    (.write w (fstr1 v))) 

、?

This answerは、print-methodがそれに派遣するので、:typeをメタデータに入れることを示唆しています。私はそれでいくつかの成功を収めましたが、私はいつもメタデータを制御することができないので、fstr1の中から以前に定義された印刷メソッドに "進む"方法があることを望んでいます。参考のため


、ここfstr1の私の現在の実装です:

(defn fstr1 ^String [x] 
    (cond 
    (ubergraph? x) 
     (fstr-ubergraph x) 
    (map? x) 
     (case (:type x) 
     :move (fstr-move x) 
     :workspace "(a workspace)" 
     :bdx (fstr-bdx x) 
     :rxn (fstr-rxn x) 
     (apply str (strip-type x))) 
    :else 
     (apply str (strip-type x)))) 
+2

前にあなたは 'set!* print-length * 10'を試してみましたか? – birdspider

答えて

2

あなたはいつもprint-objectを再バインドし、あなたが適切なときに呼び出すことができるように離れて本当のprint-objectを挟むことができます。

user> (let [real-print-method print-method] 
     (with-redefs [print-method (fn [v w] 
            (if (and (map? v) 
               (:foo v)) 
             (do 
             (real-print-method "{:foo " w) 
             (real-print-method (:foo v) w) 
             (real-print-method " ...}" w)) 
             (real-print-method v w)))] 
      (println {:foo 42 :bar 23} {:baz 11 :quux 0}))) 
{:foo 42 ...} {:baz 11, :quux 0} 
nil 
user>