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的注释,将其标记为非屏幕审核。在通过 Rich 之前,想对此进行更多评估。

0

评论者:alexmiller

切换到待定的不完整 CLJ-1093,希望将其纳入 1.6 版本。

0

评论者:alexmiller

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

0

评论者:alexmiller

CLJ-1093 的副本,根据 Nicole 的请求关闭。

0

bronsa 发表的评论:

由于为 CLJ-1093 应用的修复没有涵盖此问题,重新打开此问题

0

bronsa 发表的评论:

刷新并合并补丁

...