Suggerirei fare questo con ridurre come segue:
(defn count-truthy [coll]
(reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
Motivi per l'utilizzo di ridurre in questo modo:
- E 'probabile che sia più efficiente, e potranno beneficiare di nuove funzionalità riduttori di Clojure che consente di fatto riduce in molte collezioni
- Si evita la creazione di una sequenza intermedia (che accadrebbe se si è utilizzato una funzione di sequenza pigri come filtro)
Se si dispone già di una sequenza realizzata, allora la seguente è anche una buona opzione, in quanto potranno beneficiare di aritmetica primitiva nel loop:
(defn count-truthy [coll]
(loop [s (seq coll) cnt 0]
(if s
(recur (next s) (if (first s) (inc cnt) cnt))
cnt)))
non un duplicato - il conteggio dei valori contro il loro ritorno è un'operazione diversa (e ha alcune soluzioni abbastanza diverse) – mikera