请在2024年Clojure状态调查!中分享您的想法。

欢迎!有关如何使用此服务的更多信息,请查看关于页面。

0
打印

当将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

3 个答案

0

评论由:coventry发布

在sleight上对应的错误:https://github.com/ztellman/sleight/issues/5

0

评论者:jafingerhut

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

我没有检查更新此补丁的难易程度。

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