我非常新接触{{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}} 函数 {{odd?}},然后将其传递给 {{even?}}。
我可以通过确保我的防护函数只接受整数来修复这个问题
(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))
但是,是否确实有必要让仪词处理{{:clojure.core.match/not-found?}}? 在我的观点中,在上述例子中所有匹配的映射都具有整数值,因此似乎可以有一个只接受整数的守卫器。