출처::http://clojure.or.kr/docs/clojure-and-gof-design-patterns.html#command
2. 전략패턴(Strategy Pattern)
이름순으로 정렬(단, 유료고객은 먼저)(def users [{:subscription true :name "Y"} {:subscription true :name "Z"} {:subscription false :name "Z"}]) (sort (comparator (fn [u1 u2] (cond (= (:subscription u1) (:subscription u2)) (neg? (compare (:name u1) (:name u2))) (:subscription u1) true :else false))) users)위 소스는 comparator를 만들고 하는 것이 아주 비슷하다.
아래 소스를 봐보자.
(sort-by (juxt (complement :subscription) :name) users) ;; forward sort (sort-by (juxt :subscription :name) #(compare %2 %1) users) ;; reverse sort워워 하나씩 보자.
(sort-by count ["aaa" "bb" "c"]) ("c" "bb" "aaa")juxt 이녀석은 뭘까? (juxtaposition : 병렬, 병치)
((juxt a b c) x) == [(a x) (b x) (c x)]
(for [user users] ((juxt :subscription :name) user)) ;; ([true "Y"] [true "Z"] [false "Z"]) (for [user users] ((juxt (complement :subscription) :name) user)) ;; ([false "Y"] [false "Z"] [true "Z"])
complement (보수 말하는건가) : 함수를 받아서 true/false의 반대값을 내보냄
(def odd?? (complement even?)) (odd?? 3) true이걸 먼저 알아보자
(sort-by (juxt (complement :subscription) :name) users) ;; forward sort user=> ((complement :subscription ) {:subscription "HI"}) false user=> ((complement :a ) {:b "HI"}) true
두 줄로 만들어지는 것이 신기하다. juxt는 엄청난 함수 인 것 같다. 나중에 쓸일이 많을 것 같다.
댓글 없음:
댓글 쓰기