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 的备注,将其标记为未筛选。在通过Rich之前想对此进行更多评估。

0 投票

评论者:alexmiller

切换到不完整的待定状态 CLJ-1093,希望将其纳入 1.6 版本。

0 投票

评论者:alexmiller

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

0 投票

评论者:alexmiller

根据Nicola的要求,将其与CLJ-1093视为重复项并关闭。

0 投票

评论者:bronsa

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

0 投票

评论者:bronsa

刷新并修复补丁

...