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

  • map transforma, filter/remove seleccionan, reduce acumula.

  • some y every? comprueban condiciones sobre colecciones.

  • for genera secuencias combinando colecciones.

  • doseq/dotimes son para efectos secundarios.

Ejercicios

  1. Dado el vector [1 2 3 4 5 6 7 8 9 10], obtén solo los números impares usando filter.

  2. Usa reduce para concatenar ["Don" "Quijote" "de" "la" "Mancha"] separándolas con un espacio.

  3. Con for, genera todas las combinaciones de [:espada :lanza] y [:oro :plata].

Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.

¿Me invitas a un café?

Visitantes en tiempo real

Estás solo: 🐱