我遇到一个问题,defrecord-types在某处被转换为普通映射,由于默认情况下它们以相同的方式pprint,因此很难在深层结构中跟踪。
以下代码修补到pprint分派并打印值周围的类型;它真的很有用,但感觉有点黑客风格。
也许可以把类似的东西直接集成到clojure.pprint中(已经有了一些外观选项),即集成到clojure.pprint/write-out。
在某些情况下,仅打印{{(type)}}可能不足以;因此,打印全部元数据的选项将很棒。
也许默认为{{:metadata nil}},{{:metadata :type}}用于打印类型(但同时也适用于非IMetas,使用{{(type)}}和{{:metadata true}}打印使用{{(meta)}}的IMetas的元数据)。
(defn pprint-with-type
([object] (pprint object *out*))
([object writer]
; 保持原始分派。
; 直接调用它将只打印该对象,
; 但返回到我们的分派以打印子对象。
(let [dispatch clojure.pprint/*print-pprint-dispatch*]
(binding [clojure.pprint/*print-pprint-dispatch*
(fn [obj]
(if (instance? clojure.lang.IMeta obj)
(do (print "^{:type ")
(dispatch (type obj))
(print "} ")
(clojure.pprint/pprint-newline :fill)
(dispatch obj))
(do (print "(^:type ")
(dispatch (type obj))
(print " ")
(clojure.pprint/pprint-newline :fill)
(dispatch obj)
(print ")"))))]
(clojure.pprint/pprint object writer)))))