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

欢迎!请参阅关于页面以了解更多关于如何工作的信息。

0
core.match
我非常新接触{{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?}}? 在我的观点中,在上述例子中所有匹配的映射都具有整数值,因此似乎可以有一个只接受整数的守卫器。

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
...