如何绕过打印方法

时间:2017-09-08 15:09:51

标签: clojure multimethod

我有一个包含大量地图和其他东西的应用程序,打印时读起来很笨拙,所以我为它们制作了一个自定义打印功能并设置print-method来调用它,如下所示:< / p>

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

fstr1内,如果我确定地图不是需要特殊处理的类型之一,我该如何调用普通的打印方法?

This answer建议在元数据中放置一个:type,因为print-method会对其进行调度。我已经取得了一些成功,但我不能总是控制元数据,所以我希望有一种方法可以从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))))

1 个答案:

答案 0 :(得分:2)

您可以随时重新绑定let idx = buffer.indexOf('|'); let command = buffer.slice(0, idx); let data = buffer.slice(idx + 1); 并将真正的print-object收起来,以便在适当时调用它:

print-object