请在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 的备注,未经过筛选。在鲁继续之前想先评估一下。

0 投票

由 alexmiller 评论

切换到 Incomplete 等待 CLJ-1093,我希望能够把它拉入 1.6 版本。

0 投票

由 alexmiller 评论

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

0 投票

由 alexmiller 评论

CLJ-1093 的重复问题,应尼古拉的要求关闭。

0 投票

评论者:bronsa

由于为 CLJ-1093 应用的修复没有包含这个问题,重新打开此问题。

0 投票

评论者:bronsa

刷新并合并补丁。

...