Clojure defmethod模式匹配分派值

Clojure defmethod模式匹配分派值,clojure,dispatch,multimethod,Clojure,Dispatch,Multimethod,我似乎提出了太多的多分派功能,并希望减少数量。我目前使用的方法是多功能调用另一个多功能,但这似乎是错误的。以下是我想要的一个例子: (defmulti foo (fn [bar baz] [(:type bar) (:x baz) (:y bar)])) (defmethod foo [:z :y _] [bar baz] (<I will take anything for the 3rd element>)) (defmethod foo [:z _ :x] [bar baz

我似乎提出了太多的多分派功能,并希望减少数量。我目前使用的方法是多功能调用另一个多功能,但这似乎是错误的。以下是我想要的一个例子:

(defmulti foo
(fn [bar baz] [(:type bar) (:x baz) (:y bar)]))

(defmethod foo [:z :y _] [bar baz] (<I will take anything for the 3rd element>))
(defmethod foo [:z  _ :x] [bar baz] (<I will take anything for the 2nd element>))
(defmethod foo [:z :y :x] [bar baz] (<I must have this dispatch value>))
...
(defmulti-foo
(fn[bar-baz][(:类型条)(:x-baz)(:y条)])
(定义方法foo[:z:y uz][bar baz]())
(定义方法foo[:z:x][bar baz]())
(定义方法foo[:z:y:x][bar baz]())
...
其基本思想是,在第一种情况下,方法不关心分派值的第三个元素是什么,它将接受它们任何内容,但第二个元素必须是:y

这样的事情在clojure可能吗


我可能会要求谓词分派,我想这仍然是一项正在进行的工作。

似乎您需要正确的模式匹配,在这种情况下,您需要的是

使用core.match,您可以编写如下内容:

(match [(:type bar) (:x baz) (:y bar)]
      [:z :y _] ;;  accepts anything as the 3rd element
      [:z _ :x] ;;  accepts anything as the 2nd element
      [:z :y :x] ;; accepts precisely these values
      )