Varargs y mapas de opciones en Clojure
Suma cualquier cantidad de argumentos, expande un vector en ellos y rellena un rótulo con opciones.
;; & collects any trailing arguments into a sequence, so one defn
;; accepts as many as the caller cares to pass.
(defn total [& amounts] (reduce + 0 amounts))
(println (total 5 10 15))
;; apply spreads a collection back out into those argument slots.
(def readings [12 7 19 4])
(println (apply total readings))
;; An options map keeps settings named instead of positional;
;; destructure it with :keys and fill the gaps with :or.
(defn pad-label
[text & {:keys [width fill] :or {width 12 fill \.}}]
(apply str text (repeat (max 0 (- width (count text))) fill)))
(println (pad-label "cotton"))
(println (pad-label "cotton" :width 20 :fill \-))
Cómo funciona
(defn total [& amounts] (reduce + 0 amounts))junta todos los argumentos finales en una sola secuencia.(apply total readings)pasa los elementos dereadingscomo argumentos posicionales sueltos.pad-labelacepta& {:keys [width fill] :or {width 12 fill \.}}, así que:width 20se pasa por nombre.
Palabras clave y builtins usados aquí
applycountdefdefnmaxprintlnreducerepeatstr
El intento, en números
- Líneas
- 17
- Caracteres a escribir
- 646
- Tokens
- 107
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 92 segundos.
Paso 3 de 3 en Desestructuración; paso 21 de 27 en Fundamentos del lenguaje.