欢迎!有关如何在Clojure问答中工作的更多详细信息,请参阅关于页面。
这是core.match的一个bug,或者(不太可能)是与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这些形式时,它们仅在不同之处的gennum数字和在foo和bar中的字母f与b。
foo
macroexpand-1
f
b
我已经创建了一个复现此bug的仓库
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}