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}
用户=> (meta '^:foo [:a])
{:foo true}
user=> (def ^:const foo ^:foo [])
#'user/foo
user=> (meta foo)
{:foo true}

0

评论者:stu

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

0

评论者:stu

乍一看,实现似乎有误,因为它阻止任何非IObj对象到达EmptyExpr。可能所有持久化集合都是IObj,但不想将其硬编码。

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 的备注,将其标记为未筛查。在经过 Rich 之前想更多地评估此问题。

0

评论者:alexmiller

转换为待完成的 CLJ-1093,希望将其并入 1.6。

0

评论者:alexmiller

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

0

评论者:alexmiller

根据 Nicola 的请求,因为 CLJ-1093 的修复没有包含此问题,将其关闭。

0

评论者:bronsa

由于给 CLJ-1093 应用修复后没有涵盖此问题,因此重新开启此问题。

0

评论者:bronsa

刷新并合并补丁

...