当 print-dup 为真时,如果正在打印的物体具有只包含 :tag 键的元数据映射,打印机将其渲染为 "^value"。在某些情况下这可能会导致 IllegalArgumentException。例如。
user=> (read-string (let [ge (with-meta (gensym) {:tag Object})] (binding [*print-dup* true] (pr-str ge)))) IllegalArgumentException Metadata must be Symbol,Keyword,String or 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 must be Symbol,Keyword,String or Map clojure.lang.LispReader$MetaReader.invoke (LispReader.java:732)
附带的补丁通过使 core_print.clj 的 print-meta 总是在 print-dup 为真的情况下打印出完整的元数据映射来纠正这个问题。该补丁还包含了这个案例的测试。
(link: 1) https://github.com/ztellman/sleight https://github.com/ztellman/riddley