请在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投票
_发表的评论:by 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日更新的patch 001-CLJ-1187.patch,我在编译时遇到了语法错误。

0投票

评论者:bronsa

哦,真是讽刺,我在写Java代码时弄错了括号。

对此表示歉意,这里是正确的补丁,它应用在了upstream/master。

0投票

评论者:cldwalker

看起来没问题

0投票

评论者:bronsa

CLJ-1093包含一个修复此问题的补丁以及建议的补丁

0投票

评论者:alexmiller

由于关于CLJ-1093的注释,将其标记为未筛选。在Rich处理之前想进一步评估。

0投票

评论者:alexmiller

切换到悬挂的CLJ-1093,我希望将其拉入1.6版本。

0投票

评论者:alexmiller

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

0投票

评论者:alexmiller

由于Nicola的要求,重复标记为CLJ-1093的副本,并关闭。

0投票

评论者:bronsa

由于为CLJ-1093应用的修复未涵盖此问题,重新开放此问题

0投票

评论者:bronsa

刷新并压缩补丁

...