欢迎!有关如何使用本站的信息,请参阅关于页面。
这是 core.match 或(极少可能)Clojure 宏展开中的一个错误。
以下代码
`(let [foo [:bar :baz]](match foo
`
(link: :bar boo) boo :else :got-else))
返回 :baz。而此代码
:baz
(link: :bar foo) foo :else :got-else))
返回 :got-else。
:got-else
它们应该相等,因为匹配中的 foo 应该掩盖在let 中的 foo。实际上,当对这些形式执行 macroexpand-1时,它们只在genSym 数字以及在 foo 和 bar 中的 f 与 b 字母上有区别。
foo
macroexpand-1
bar
f
b
我已经创建了一个重现错误的仓库
https://github.com/magnars/bug-examples/tree/core-match-shadow-bindings
评论由:glchapman
这实际上是按设计方式工作的。core.match 将在宏的 &env 中出现的本地定义的符号(符号出现在宏中)视为字面表达式中,其字面值是求值后的符号(为查看这一点,请查看 match.clj 中的 **locals** 变量使用情况)。因此,在您失败的案例中,match 实际上是这样的
(match foo [:bar [:bar :baz]] foo :else :got-else}