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

评论由: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

留言者:alexmiller

由于关于 CLJ-1093 的注释,标记为非监控。想在 Richie 审查之前评估这个问题。

0

留言者:alexmiller

将 CLJ-1093 切换为不完整的待处理状态,希望将其合并到 1.6。

0

留言者:alexmiller

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

0

留言者:alexmiller

CLJ-1093 的重复项,根据 Nicols 的要求关闭。

0

评论由:bronsa

由于应用于 CLJ-1093 的修复方案未包含此问题,因此重新打开此问题

0

评论由:bronsa

刷新并合并补丁

...