2024年Clojure状态调查!分享你的看法。

欢迎!请参阅关于页面以了解有关本站的更多信息。

+1
Collections
已关闭
空集合上的元数据丢失


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 的重复,在 Niccola 的要求下已关闭。

0

评论者:bronsa

因为为 CLJ-1093 应用的修复没有包含这个修复,所以重新开放这个问题。

0

评论者:bronsa

更新并压缩补丁

...