2014-07-05 2 views
1

너무 많은 멀티 디스패치 기능이 떠오르고있는 것처럼 보입니다. 숫자를 줄이려고합니다. 내가 현재 사용하고있는 접근법은 다기능 다기능을 다른 다기능 전화로 호출하는 것이지만 잘못된 것으로 보입니다. 여기에 내가 좋아하는 것이 무엇의 예입니다 : 첫 번째 경우에 방법은 파견 값의 세 번째 요소가 무엇인지 상관하지 않는 것을 기본 개념, 그것은 그들에게 아무것도 걸릴 것Clojure defmethod 패턴 일치 디스패치 값

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

,하지만 두 번째 요소는 다음과 같아야합니다.

클로저에 이와 비슷한 기능이 있습니까?

저는 술어 파견을 요청할 수도 있습니다. 아직 진행중인 작업입니다.

답변

2

올바른 패턴 일치가 필요한 것 같습니다.이 경우 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 
    ) 
:

core.match를 사용하여, 당신은 뭔가를 쓸 수 있습니다