Clojure 如何绕过打印方法
我有一个应用程序,有很多大型地图和其他东西,打印时阅读起来很笨拙,因此我为它们创建了一个自定义打印函数,并设置了Clojure 如何绕过打印方法,clojure,multimethod,Clojure,Multimethod,我有一个应用程序,有很多大型地图和其他东西,打印时阅读起来很笨拙,因此我为它们创建了一个自定义打印函数,并设置了print method来调用它,如下所示: (defmethod print-method clojure.lang.PersistentArrayMap [v ^java.io.Writer w] (.write w (fstr1 v))) 在fstr1中,如果我确定地图不是需要特殊处理的类型之一,如何调用普通打印方法 建议在元数据中添加:type,因为打印方法会在该元数据上
print method
来调用它,如下所示:
(defmethod print-method clojure.lang.PersistentArrayMap [v ^java.io.Writer w]
(.write w (fstr1 v)))
在fstr1
中,如果我确定地图不是需要特殊处理的类型之一,如何调用普通打印方法
建议在元数据中添加: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))))
您始终可以重新绑定打印对象
,并将真实的打印对象
折叠起来,以便在适当的时候调用它:
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>
在研究替代解决方案之前-您是否尝试过(设置!*打印长度*10)