欢迎!请查看关于页面以了解更多关于该功能的信息。
这是一个 core.match 的错误,或者(可能性极小)是 Clojure 的宏展开错误。
此代码
`(let (link: 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
let
macroexpand-1
bar
f
b
我已创建一个重现错误的仓库
https://github.com/magnars/bug-examples/tree/core-match-shadow-bindings
评论者:glchapman
这实际上是按照设计工作的。core.match 将本地定义的符号(出现在宏的 &env 中的符号)视为字面表达式,其中字面值是被评估的符号(要在 match.clj 中看到这一点,请查找 **locals** 变量的使用)。因此,您的失败案例中的匹配实际上是
(match foo [:bar [:bar :baz]] foo :else :got-else}