2024 Clojure状态调查中分享您的想法!

欢迎!有关如何在Clojure问答中工作的更多详细信息,请参阅关于页面。

0
core.match

这是core.match的一个bug,或者(不太可能)是与Clojure宏展开有关。

此代码

`
(let [link: foo [:bar :baz]]
(match foo

(link: :bar boo) boo
:else :got-else))

`

返回:baz。而此代码

`
(let [link: foo [:bar :baz]]
(match foo

(link: :bar foo) foo
:else :got-else))

`

返回:got-else

它们应该相等,因为在匹配中的foo应该隐藏在let中的foo
实际上,在运行macroexpand-1这些形式时,它们仅在不同之处
的gennum数字和在foo和bar中的字母fb

我已经创建了一个复现此bug的仓库

https://github.com/magnars/bug-examples/tree/core-match-shadow-bindings

2 个答案

0

评论者:glchapman

这实际上是按设计工作的。core.match将局部定义的符号(在宏的&env中出现的符号)视为文字表达式,其中文字值是评估后的符号(要看到在match.clj中的此内容,请查找对**locals**变量的使用)。因此,在您失败的案例中的match实际上是

(match foo [:bar [:bar :baz]] foo :else :got-else}

0
参考:https://clojure.atlassian.net/browse/MATCH-126(由alex+import报告)
...