2024 克洛爵状态调查!上分享您的想法。

欢迎!有关如何使用本站的信息,请参阅关于页面。

0
core.match

这是 core.match 或(极少可能)Clojure 宏展开中的一个错误。

以下代码

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

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

`

返回 :baz。而此代码

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

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

`

返回 :got-else

它们应该相等,因为匹配中的 foo 应该掩盖在
let 中的 foo。实际上,当对这些形式执行 macroexpand-1时,它们只在
genSym 数字以及在 foobar 中的 fb 字母上有区别。

我已经创建了一个重现错误的仓库

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 报告)
...