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)