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

欢迎!请查看关于页面以了解更多关于该功能的信息。

0
core.match

这是一个 core.match 的错误,或者(可能性极小)是 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 操作这些形式时,它们仅在
gensym 数字以及 foobar 中的字母 fb 上有所不同。

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

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

2 个回答

0

评论者:glchapman

这实际上是按照设计工作的。core.match 将本地定义的符号(出现在宏的 &env 中的符号)视为字面表达式,其中字面值是被评估的符号(要在 match.clj 中看到这一点,请查找 **locals** 变量的使用)。因此,您的失败案例中的匹配实际上是

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

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