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 en nil, evitando errores.

Ejercicios

  1. Usa ->> para obtener la suma de los cuadrados de los números pares del 1 al 10.

  2. Usa -> para crear un Map {:nombre "Quijote"}, añadir :edad 50 y actualizar :edad incrementándola en 1.

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Will you buy me a coffee?

Visitors in real time

You are alone: 🐱