12. Iteraciones
Recorrer una lista de valores es el pan de cada día en la programación funcional. Si las funciones son la espada del caballero, las iteraciones son su caballo: sin ellas no llegas a ningún sitio. La gran mayoría de los problemas se reducen a recorrer datos con una intención: transformar, filtrar o acumular.
map
Aplica una función a cada elemento y devuelve una nueva colección. Es como pasar a todo un ejército por la armería: cada soldado entra y sale transformado.
(map #(* % %) [2 5 7 9])
;; (4 25 49 81)
filter y remove
filter conserva los elementos que cumplen la condición, como seleccionar a los caballeros dignos de una misión. remove hace lo contrario: descarta a los que cumplen.
(filter odd? [1 2 3 4 5])
;; (1 3 5)
(remove odd? [1 2 3 4 5])
;; (2 4)
reduce
Recorre la colección acumulando un resultado. Imagina a Sancho recogiendo monedas en cada pueblo que visita: al final del viaje tiene el total.
(reduce + [34 21 15])
;; 70
(reduce str ["Don" " " "Quijote"])
;; "Don Quijote"
Con valor inicial:
(reduce (fn [acc val] (str acc ", " val)) "Lista:" ["a" "b" "c"])
;; "Lista:, a, b, c"
some y every?
some devuelve el primer valor verdadero. every? comprueba que todos cumplan.
(some even? [1 3 4 7])
;; true
(every? pos? [1 2 3])
;; true
for
No te dejes engañar por el nombre. for en Clojure no es un bucle, es una comprensión de listas: genera una nueva secuencia combinando colecciones. Puedes filtrar con :when y crear variables auxiliares con :let.
(for [x [0 1 2 3 4 5]
:let [y (* x 3)]
:when (even? y)]
y)
;; (0 6 12)
doseq y dotimes
Para efectos secundarios (imprimir, guardar…).
(doseq [instrumento ["violín" "flauta"]]
(println instrumento))
;; violín
;; flauta
(dotimes [i 3]
(println i))
;; 0
;; 1
;; 2
take-while y drop-while
Trabajan con colecciones ordenadas de forma eficiente.
(take-while #(< % 5) (range 10))
;; (0 1 2 3 4)
(drop-while #(< % 5) (range 10))
;; (5 6 7 8 9)
Resumen
-
maptransforma,filter/removeseleccionan,reduceacumula. -
someyevery?comprueban condiciones sobre colecciones. -
forgenera secuencias combinando colecciones. -
doseq/dotimesson para efectos secundarios.
Ejercicios
-
Dado el vector
[12345678910], obtén solo los números impares usandofilter. -
Usa
reducepara concatenar["Don""Quijote""de""la""Mancha"]separándolas con un espacio. -
Con
for, genera todas las combinaciones de[:espada:lanza]y[:oro:plata].
Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.
Apóyame en Ko-fi