我在代码库处理中遇到了 defrecord-types 转换为普通问题,这在深层结构中相对难以跟踪,因为默认情况下它们会被顶层打印为相同的东西。
以下代码修补到 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 ")
(do (print "(^:type ")
(print "}")
(print " ")
(dispatch obj)
(print ")"))))