给定x
and y
,两者都旨在匹配具有相同匹配子句的映射。唯一的区别在于子句的顺序:
(ns so.example
(:require
[clojure.core.match :refer [match]]))
(defn x [m]
(match m
{:a _} :a0
{:a _ :b _} :ab0))
(defn y [m]
(match m
{:a _ :b _} :ab0
{:a _} :a0))
我想匹配{:a 1 :b 2}
:
(x {:a 1 :b 2})
;=> :a0
(y {:a 1 :b 2})
;=> :ab0
该函数y
已经为给定的地图产生了预期的结果。
诚然,我可能不明白算法是如何工作的,但我的印象是,它clojure.core.match
会以某种方式解决,{:a _ :b _}
比它更具体{:a _}
,因此会先尝试。
这就是为什么我惊讶地发现匹配子句的顺序似乎很重要。
为什么会这样或者我做错了什么?