ho scritto questa funzione che fa questo (più facile mostrare che spiegare):Qual è il modo Clojure più idiomatico di scrivere questo?
(split 2 (list 1 2 3 4 5 6))
=> ((1 2) (2 3) (3 4) (4 5) (5 6))
(defn split [n xs]
(if (> (count xs) (dec n))
(cons (take n xs) (split n (rest xs)))
'()))
Capisco che in Clojure l'elenco non è l'unica struttura prima dei dati di classe. Avrebbe senso scrivere questa struttura dati-agnostica? E a prescindere, la mia implementazione è la più efficiente e se non la stessa, come la renderei più efficiente e/o idiomatica?
Grazie!
Neat, grazie per il suggerimento. Fare quel singolo cambiamento - contando il "take n" piuttosto che la sequenza - alla versione loop/recur ha ridotto il tempo da 3000ms a 20ms per un range di 10k ...Dovrò ricordare che next/rest restituisce una sequenza, dove count è O (n). –