tutorial online example clojure

online - clojure vs scala



Rasgos ocultos de Clojure. (5)

Clojure tiene un tipo de datos de cola persistente e inmutable, PersistentQueue, pero no tiene (¿aún?) Sintaxis de lector literal o funciones de envoltorio de Clojure, por lo que tiene que crear uno mediante una llamada de Java. Las colas se juntan (empujan) en la parte posterior y sobresalen desde el frente con un buen rendimiento.

user> (-> (clojure.lang.PersistentQueue/EMPTY) (conj 1 2 3) pop) (2 3)

Listas conj en el frente y pop desde el frente. Los vectores se conjuntan en la parte trasera y saltan por la parte trasera Así que las colas son a veces exactamente lo que necesitas.

user> (-> () (conj 1 2 3) pop) (2 1) user> (-> [] (conj 1 2 3) pop) [1 2]

¿Qué características menos conocidas pero útiles de Clojure se encuentran usando? Siéntase libre de compartir pequeños trucos y modismos, pero trate de restringirse a Core y Contrib.

Encontré información realmente interesante en respuestas a estas preguntas similares:

Hay muchas más preguntas sobre "características ocultas" para otros idiomas, así que pensé que también sería bueno tener una para Clojure.


Desde el sitio de ClojureDocs, cada vez más bueno, un idioma con juxt http://clojuredocs.org/clojure_core/clojure.core/juxt

;juxt is useful for forking result data to multiple termination functions (->> "some text to print and save to a file" ((juxt println (partial spit "useful information.txt"))))


La macro del lector read-eval: #=

(read-string "#=(println /"hello/")")

Esta macro puede presentar un riesgo de seguridad si se usa la read en la entrada del usuario (lo que quizás sea una mala idea por sí misma). Puede desactivar esta macro configurando *read-eval* en false .


Puedes apply funciones a secuencias de argumentos infinitos. Por ejemplo

(apply concat (repeat ''(1 2 3)))

produce una secuencia perezosa de 1,2,3,1,2,3 ... Por supuesto, para que esto funcione, la función también tiene que ser perezosa con respecto a su lista de argumentos.


(defn foo [a & [b c]] ...)

Puedes desestructurar el resto del argumento.

Actualizar:

El último compromiso con el repositorio de git (29389970bcd41998359681d9a4a20ee391a1e07c) ha hecho posible la desestructuración asociativa así:

(defn foo [a & {b :b c :c}] ...)

El uso obvio de esto es para argumentos de palabras clave. Tenga en cuenta que este enfoque evita mezclar argumentos de palabras clave con argumentos de reposo (no es que eso sea algo que probablemente se necesite muy a menudo).

(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)

Si desea valores por defecto para los argumentos de palabras clave.