2010-03-22 21 views
27

¿Qué características menos conocidas pero útiles de Clojure encuentran? Siéntete libre de compartir pequeños trucos y modismos, pero trata de restringirte a Core y Contrib.Características ocultas de Clojure

me encontré con algo de información realmente interesante en las respuestas a estas preguntas similares:

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

Respuesta

12

La lectura eval lector macro: #=

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

Esta macro se puede presentar un riesgo de seguridad si se utiliza read la entrada del usuario (que es tal vez una mala idea por sí sola). Puede desactivar esta macro configurando *read-eval* en false.

24

Clojure tiene un tipo de datos de colas inmutable y persistente, PersistentQueue, pero no tiene (todavía?) La sintaxis del lector literal o las funciones de Clojure, por lo que debe crear una a través de una llamada Java. Colas conj (push) en la parte posterior y pop desde el frente con buen rendimiento.

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

Listas conj en el frente y pop de la parte delantera. Los vectores se unen en la parte posterior y se abren desde la parte posterior. Así que las colas a veces son exactamente lo que necesitas.

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

WOW. sacando 100000 artículos de una lista, mi computadora tarda ~ 12ms. Convirtiendo la lista a una cola Y haciendo estallar todo toma ~ 0.2. Eso es una gran ayuda en el programa que estoy escribiendo. – MBCook

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

Puede desestructurar el argumento resto.

Actualización:

último commit al repositorio git (29389970bcd41998359681d9a4a20ee391a1e07c) ha hecho posible la realización de desestructuración asociativo de este modo:

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

El uso obvio de esto es para los argumentos de palabras clave. Tenga en cuenta que este enfoque evita mezclar argumentos de palabras clave con argumentos de descanso (no es probable que se necesite con mucha frecuencia).

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

Si desea valores predeterminados para los argumentos de palabra clave.

+0

Hm, no me di cuenta de que la edición en las noticias calientes me daría una participación mayoritaria en esta respuesta ... Creo que ahora solo tengo la idea detrás de esta cosa wiki comunitaria. @dnolen: Por favor, no dudes en "volver a tomar" esto si es importante de alguna manera. –

8

Puede apply funciones para infinitas secuencias de argumentos. Por ejemplo

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

produce una secuencia lenta de 1,2,3,1,2,3 ... Por supuesto, para que esto funcione la función también tiene que ser perezoso con respecto a la lista de parámetros.

+1

Hay una manera mejor de hacer esto (ciclo '(1 2 3)) – nickik

+2

@nickik: Por supuesto - '(repeat' (1 2 3))' solo se entiende como un ejemplo secuencia infinita de secuencias para mostrar cómo '(apply concat ...)' funciona. –

7

Desde el cada vez más buen sitio ClojureDocs utilizando un lenguaje 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")))) 

Cuestiones relacionadas