Je voudrais filtrer un ensemble, quelque chose comme :
(filter-set even? #{1 2 3 4 5})
; => #{2 4}
Si j'utilise clojure.core/filter
J'obtiens une séquence qui n'est pas un ensemble :
(filter even? #{1 2 3 4 5})
; => (2 4)
Donc le mieux que j'ai pu trouver est :
(set (filter even? #{1 2 3 4 5}))
Mais je n'aime pas ça, ça n'a pas l'air optimal de passer du plateau à la liste puis au plateau. Quelle serait la méthode Clojurienne pour cela ?
UPDATE
J'ai fait ce qui suit pour comparer les approches de @A.Webb et @Beyamor. Il est intéressant de noter que les deux approches ont des performances presque identiques, mais clojure.set/select
est légèrement meilleur.
(defn set-bench []
(let [big-set (set (take 1000000 (iterate (fn [x] (int (rand 1000000000))) 1)))]
(time (set (filter even? big-set))) ; "Elapsed time: 422.989 msecs"
(time (clojure.set/select even? big-set))) ; "Elapsed time: 345.287 msecs"
nil) ; don't break my REPL !