在《2024 Clojure 状态调查》中分享你的想法!点击此处开始调查!

欢迎!请参阅《关于》页面以了解有关此问答系统的一些更多信息。

+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 投票

by: stu

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

0 投票

by: stu

乍一看,实现看起来是错误的,因为它阻止了任何非IObjs到达EmptyExpr。可能所有持久集合都是IObjs,但不想将其嵌入其中。

0 投票

by: bronsa

你是对的,我已经更新了补丁,现在应该能按预期工作。

0 投票

by: jafingerhut

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

0 投票

by: bronsa

哦,讽刺!我在写Java时弄错了括号。

为此道歉,这是正确的补丁,它应用于upstream/master。

0 投票

by: cldwalker

看起来不错

0 投票

by: bronsa

CLJ-1093包含一个修复此问题的补丁,应优先考虑

0 投票

评论者:alexmiller

由于与CLJ-1093相关的注释,未标记为已筛选。在通过Rich之前,想先评估一下。

0 投票

评论者:alexmiller

切换到待定的不完整项CLJ-1093,我希望能将其拉到1.6版本中。

0 投票

评论者:alexmiller

从1.6版本中撤出,将在下一个版本中考虑。

0 投票

评论者:alexmiller

由于与CLJ-1093的重复,应Nicola的要求关闭。

0 投票

by: bronsa

重新打开这个,因为应用于CLJ-1093的修复并没有涵盖这个问题

0 投票

by: bronsa

刷新并合并补丁

...