15. Threading Macros
Anidar funciones en Clojure es como meter una Matrioshka dentro de otra: funciona, pero llega un punto en que nadie sabe dónde empieza cada muñeca. Las threading macros desenredan ese ovillo y convierten el código en un flujo que se lee de arriba a abajo, como una buena historia de caballerías.
Thread-first (->)
Inserta el resultado como primer argumento de la siguiente función. Tu mejor aliado para trabajar con Maps e interoperabilidad Java.
(-> "don quijote de la mancha"
clojure.string/upper-case
(clojure.string/replace "QUIJOTE" "CLOJURE"))
;; "DON CLOJURE DE LA MANCHA"
Sin threading sería:
(clojure.string/replace (clojure.string/upper-case "don quijote de la mancha") "QUIJOTE" "CLOJURE")
Thread-last (->>)
Inserta el resultado como último argumento. Es el compañero natural de las funciones de secuencias (map, filter, reduce…) que siempre esperan la colección al final.
(->> (range 10)
(filter odd?)
(map #(* % %))
(reduce +))
;; 165
Regla de oro
-
Funciones de datos (
assoc,update,get): esperan el dato primero → usa->. -
Funciones de secuencias (
map,filter,reduce): esperan la secuencia al final → usa->>.
some→
Como -> pero se detiene y devuelve nil si algún paso produce nil. Evita errores de NullPointerException.
(some-> {:nombre "Sancho"}
:edad
inc)
;; nil (porque :edad no existe, devuelve nil y se detiene)
Resumen
-
->pasa el resultado como primer argumento. Para Maps y Java. -
->>pasa el resultado como último argumento. Para secuencias. -
some→se detiene ennil, evitando errores.
Ejercicios
-
Usa
->>para obtener la suma de los cuadrados de los números pares del 1 al 10. -
Usa
->para crear un Map{:nombre"Quijote"}, añadir:edad50y actualizar:edadincrementándola en 1.
Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.
Apóyame en Ko-fi