2024 Clojure现状调查中分享您的想法!

欢迎!请查看关于页面获取更多关于如何使用此服务的信息。

0
core.match by
我对{{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。

2个回答

0

评论者:tsdh

实际上,您可以使用这个 {{:clojure.core.match/not-found}} 特殊值来创建一种扭曲的映射模式,只有在不匹配的情况下才会匹配,如下所示。

(match [{:a 1}] [{:b (a :guard #(identical? % :clojure.core.match/not-found))}] :yes :else :no) ;=> yes

但我猜(并希望)没有人会依赖于这样的奇怪行为。

0
...