Clojure defmethod Pattern Match Dispatch-Value

Кажется, я придумываю слишком много мультидиспетчерских функций и хотел бы уменьшить их количество. Подход, который я сейчас использую, состоит в том, чтобы одна многофункциональная функция вызывала другую многофункциональную, но это кажется неправильным. Вот пример того, что я хотел бы:

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

Основная идея заключается в том, что в первом случае методу все равно, какой третий элемент значения отправки, он примет что угодно, но вторым элементом должен быть :y.

Возможно ли что-то подобное в clojure?

Возможно, я прошу предикатную отправку, которая, я думаю, все еще находится в стадии разработки.


person phreed    schedule 05.07.2014    source источник


Ответы (1)


Кажется, вам нужно правильное сопоставление с образцом, и в этом случае вам нужен core.match.

Используя 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
      )
person leonardoborges    schedule 05.07.2014