分享您的想法,参加2024年Clojure调查!(https://www.surveymonkey.com/r/clojure2024)

欢迎!请参阅“关于”页面,了解更多关于如何使用本站的信息。

+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

乍一看,该实现看起来有问题,它会阻止非IObj对象到达EmptyExpr。可能所有持久集合都是IObj对象,但不想将这一特性内嵌。

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

刷新和压缩补丁

...