Macros de encadenamiento en Clojure
Un pipeline de elevaciones escrito anidado, luego con ->>, y -> sobre un mapa.
(def elevations [820 1450 610 1980 1230])
;; nested calls read inside out: the last thing written happens first
(println (apply + (take 3 (sort > (filter #(> % 700) elevations)))))
;; ->> threads the value into the last slot, which suits seq functions
(println (->> elevations
(filter #(> % 700))
(sort >)
(take 3)
(apply +)))
;; -> threads into the first slot, which suits maps and assoc/update
(def trail {:name "ridge loop" :miles 6.2})
(println (-> trail
(assoc :gain 1450)
(update :miles + 0.8)
(assoc :steep? true)))
Cómo funciona
- El
(apply + (take 3 (sort > (filter #(> % 700) elevations))))anidado se lee de adentro hacia afuera. ->>encadena el valor en la última ranura, así(filter #(> % 700))y(take 3)quedan en orden de lectura.->encadena en la primera ranura y deja que(assoc :gain 1450)y(update :miles + 0.8)recorrantrail.
Palabras clave y builtins usados aquí
applyassocdeffilterprintlnsorttake
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 525
- Tokens
- 100
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 86 segundos.
Paso 3 de 3 en Secuencias; paso 15 de 27 en Fundamentos del lenguaje.