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

欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。

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


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

切换到待完成的 CLJ-1093,希望将其纳入 1.6 版本。

0
by

评论者:alexmiller

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

0
by

评论者:alexmiller

按Nicola的要求已关闭与CLJ-1093的重复项。

0
by

评论者:bronsa

因为 CLJ-1093 的修复方案没有包含这个问题,所以重新开启这个问题。

0
by

评论者:bronsa

刷新并合并补丁

...