2024年Cljure现状调查!中分享您的看法。

欢迎!请参阅关于页面了解有关此工作的一些更多信息。

+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

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

0投票

评论者:bronsa

重新开启此问题,因为应用于CLJ-1093的修复方案没有包括这个问题。

0投票

评论者:bronsa

刷新并合并补丁

...