2024 Clojure 状态调查!中分享您的看法。

欢迎!请查看关于页面了解本项目的工作方式。

0
打印

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

3 个答案

0

评论者:coventry

在 sleight 中的相关错误:https://github.com/ztellman/sleight/issues/5

0
by

评论由:jafingerhut 制造

2013年10月2日的补丁0001-Don-t-use-shorthand-for-typehints-when-print-dup.patch,在2014年8月29日对Clojure进行一些提交之后,无法干净地应用到最新的master上。在此之前一天,它可以干净地应用。

我还没有检查更新这个补丁可能有多容易或困难。

0
by
参考:https://clojure.atlassian.net/browse/CLJ-1275(由 coventry 报告)
...