我对{{core.match}}非常新手,刚刚开始尝试。在这么做的时候,我遇到了这个例子
(for [x [[1 2 3]
[1 2 3 4]
{:a 17, :b 2}
{:a 23, :b 7}]]
(match [x]
[[a b c]] [a b c]
[{:a a, :b 2}] {:a a}
[{:a (a :guard odd?), :b b}] {:a a, :b b}
:else :no-match))
这段代码会报错,错误信息为 ??"IllegalArgumentException Argument must be an integer: :clojure.core.match/not-found clojure.core/even? core.clj:1351)"??. 问题在于将关键字{{:clojure.core.match/not-found}}传递给了{{:guard}}函数,而这个函数将其传递给了{{even?}}。
我可以通过确保我的guard只接收整数来修复它,如下所示
(for [x [[1 2]
[1 2 3]
[1 2 3 4]
{:a 17, :b 2}
{:a 23, :b 7}]]
(match [x]
[[a b c]] [a b c]
[{:a a, :b 2}] {:a a}
[{:a (a :guard #(and (integer? %)
(odd? %))), :b b}] {:a a, :b b}
:else :no-match))
但是,guard函数真的必须处理{{:clojure.core.match/not-found?}}吗?在我看来,在上面的例子中,所有匹配的映射都有整数值,所以似乎可以这样有一个只接受整数的guard。