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的重复,应Nicola的要求关闭。

0

评论者:bronsa

重新开启这个,因为应用CLJ-1093的修复并未包含这个问题

0

评论者:bronsa

更新并修复补丁

...