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

欢迎!请查看关于页面获取更多关于如何使用本页的信息。

+1
集合
已关闭
空集合上的元数据丢失


user=> (meta '^:foo [])
nil   ;; 预期 {:foo true},就像这样
user=> (meta '^:foo [1])
{:foo true}


此错误会传播到 ^:const 变量

user=> (def ^:const foo ^:foo [])
#'user/foo
user=> (meta foo)
nil
user=> (meta @#'foo)
{:foo true}


*原因:* 如同 CLJ-1093,空集合被替换为一个不包含元数据的 EmptyExpr

*建议:* 如果存在元数据,则不要替换为 EmptyExpr。

*补丁:* 0001-Support-retrieval-of-metadata-from-quoted-empty-lite.patch

*审核人员:*
关闭时备注:发布

19 答案

0
 
最佳回答

在 1.10.2-alpha3 中发布修复

0
_评论由:bronsa_ 提交

补丁后

user=> (meta '^:foo [])
{:foo true}
user=> (meta '^:foo [:a])
{:foo true}
user=> (def ^:const foo ^:foo [])
#'user/foo
user=> (meta foo)
{:foo true}

0

由 stu 添加的评论:

我认为标题应该是“Clojure在空字面量上丢失了引用元数据”。

0

由 stu 添加的评论:

乍看之下,实现看起来是错误的,因为它阻止了非IObjs进入EmptyExpr。可能所有持久化集合都是IObjs,但是不想把这一点固定下来。

0

由 bronsa 添加的评论:

你说得对,我已经更新了我的补丁,现在应该可以按预期工作。

0

由 jafingerhut 添加的评论:

Nicola:您2013年3月29日更新的补丁001-CLJ-1187.patch在我试图编译时出现语法错误。

0

由 bronsa 添加的评论:

哦,讽刺啊,我在写java的时候搞错了括号。

对此表示歉意,以下是正确的补丁,它适用于 upstream/master。

0

由 cldwalker 添加的评论:

看起来不错。

0

由 bronsa 添加的评论:

CLJ-1093包含一个补丁,该补丁也修复了这个问题,应该优先考虑。

0
by

评论由:alexmiller 发布

由于关于 CLJ-1093 的注释,标记为未筛查。在 Rich 通过之前想更深入地评估。

0
by

评论由:alexmiller 发布

切换到待定的 Incomplete pending CLJ-1093,希望将其添加到 1.6 版本中。

0
by

评论由:alexmiller 发布

从 1.6 版本中移除,将在下一个版本中考虑。

0
by

评论由:alexmiller 发布

由于 Nicola 的请求,闭于此问题,因为它与 CLJ-1093 重复。

0
by

由 bronsa 添加的评论:

由于应用给 CLJ-1093 的修复没有涵盖这个问题,重新开放。

0
by

由 bronsa 添加的评论:

刷新并压缩补丁

...