1

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

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

在里面fstr1,如果我确定地图不是需要特殊处理的类型之一,我怎么能调用普通的打印方法?

这个答案建议将 a: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))))
4

1 回答 1

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> 
于 2017-09-08T19:57:19.650 回答