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

欢迎!请查看关于页面以获取更多关于此功能的信息。

+1投票
集合
已关闭
空集合元数据丢失


user=> (meta '^:foo [])
nil   UNITY expected {: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的重复项,尼古拉请求关闭。

0投票

评论者:bronsa

由于CLJ-1093的修复方案未涵盖此问题,重新打开。

0投票

评论者:bronsa

刷新并合并补丁

...