请在2024 Cljs 状态调查中分享您的意见!

欢迎!请查阅关于页面以了解更多关于如何使用本站的信息。

+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 一样,空集合被替换成丢失 meta 的 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 发布的评论:

初步看来,实现看起来是错误的,因为它阻止了所有的非 IObjjs 访问 EmptyExpr。可能所有持久集合都是 IObjjs,但不希望将其硬编码。

0 投票

bronsa 发布的评论:

你说得对,我已经更新了我的补丁,现在应该按预期工作了。

0 投票

jafingerhut 发布的评论:

Nicola:你于2013年3月29日更新的补丁 001-CLJ-1187.patch,我在尝试编译时遇到了语法错误。

0 投票

bronsa 发布的评论:

哦,讽刺啊,我在写 java 的时候弄错了一些括号。

对此表示歉意,这里是正确的补丁,它适用于 upstream/master。

0 投票

cldwalker 发布的评论:

看起来不错。

0 投票

bronsa 发布的评论:

CLJ-1093 包含一个补丁,可以修复此问题,应优先考虑。

0 投票
by

由 alexmiller 发表评论

由于关于 CLJ-1093 的备注,将其标记为未审查。在Rich审阅之前想先对此进行评估。

0 投票
by

由 alexmiller 发表评论

由于 CLJ-1093,切换到待定状态,希望将其纳入 1.6 版本。

0 投票
by

由 alexmiller 发表评论

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

0 投票
by

由 alexmiller 发表评论

CLJ-1093 的复制项,应Nicola的要求关闭。

0 投票
by

bronsa 发布的评论:

由于应用于 CLJ-1093 的修复方案并未涵盖此问题而重新开启此问题。

0 投票
by

bronsa 发布的评论:

刷新并合并补丁

...