当将print-dup设置为true时,如果正在打印的对象具有只包含:tag键的元数据映射,则打印机将其渲染为"^value"。在某些情况下,如果尝试重新读取打印的字符串,则可能导致IllegalArgumentException。例如:
user=> (read-string (let [ge (with-meta (gensym) {:tag Object})] (binding [*print-dup* true] (pr-str ge)))) IllegalArgumentException Metadata必须为Symbol, Keyword, String或Map clojure.lang.LispReader$MetaReader.invoke (LispReader.java:732)
这导致sleight/riddley对(case)宏的处理出现问题,该宏在其返回的表单中引入gensym时丢弃了类型提示。当sleight尝试从riddley重新序列化宏展开的(case)表单时,如上所述,它将失败。例如:
user=> (read-string (binding [*print-dup* true] (pr-str (macroexpand '(case 1 1 1))))) user=> IllegalArgumentException Metadata必须为Symbol, Keyword, String或Map clojure.lang.LispReader$MetaReader.invoke (LispReader.java:732)
附加的补丁通过使core_print.clj的print-meta始终在print-dup为true时打印完整的元数据映射来解决此问题。该补丁还包含对此情况的测试。
(link: 1) https://github.com/ztellman/sleight https://github.com/ztellman/riddley