tutorial online framework example clojure

online - clojure web framework



¿Qué hace-> hacer en clojure? (6)

He visto el símbolo de clojure -> usado en muchos lugares, pero no estoy seguro de cómo se llama y hace este símbolo, o incluso si es parte de un clojure estándar. ¿Podría alguien explicarme esto?


''->'' es una macro. Creo que la mejor manera de describirlo es en el ejemplo de la "forma especial de puntos" para la que sirve para hacer que el código sea más conciso y legible, como se indica en la explicación del sitio especial de clojure.org de The Dot special formar

(.. System (getProperties) (get "os.name"))

se expande a:

(. (. System (getProperties)) (get "os.name"))

pero es más fácil de escribir, leer y entender. Vea también la macro -> que se puede usar de manera similar:

(-> (System/getProperties) (.get "os.name"))

También hay ''doto''. Digamos que tiene un solo objeto al que le gustaría llamar a varios configuradores consecutivos. Podrías usar ''doto''.

(doto person (.setFName "Joe") (.setLName "Bob") (.setHeight [6 2]))

En el ejemplo anterior, los configuradores no devuelven nada, lo que hace que ''doto'' sea la opción adecuada. El -> no funcionaría en lugar de "doto" a menos que los configuradores devolvieran "esto".

Entonces, esas son algunas técnicas relacionadas con la macro ->. Espero que eso ayude a explicar no solo lo que hacen, sino también por qué existen.


-> utiliza el resultado de una llamada de función y lo envía, en secuencia, a la siguiente llamada de función.

Entonces, el ejemplo más fácil sería:

(-> 2 (+ 3))

Devuelve 5, porque envía 2, a la siguiente función de llamada (+ 3)

Construyendo sobre esto,

(-> 2 (+ 3) (- 7))

Devoluciones -2. Mantenemos el resultado de la primera llamada, (+ 3) y lo enviamos a la segunda llamada (- 7).

Como lo señaló @bending, la respuesta aceptada hubiera sido mejor mostrar la macro doto.

(doto person (.setFName "Joe") (.setLName "Bob") (.setHeight [6 2]))


Es una forma de escribir el código de izquierda a derecha, en lugar de hacerlo de adentro hacia afuera, por ejemplo,

(reduce (map (map xs bar) foo) baz)

se convierte en

(-> xs (map bar) (map foo) (reduce baz))

Es posible que desee leer la fuente, está here .

EDITAR: Se corrigió mi confusión de -> con ->> , gracias a amalloy. Lamentablemente mi ejemplo ahora es poco probable que aparezca en la práctica.


No obtuve completamente lo que hizo (> zorzal o hilo) hasta que lo visualicé así:

(-> expr f1 f2 f3) ;same as (f3 (f2 (f1 expr))) (-> expr ;same as form above f1 ;just a different visual layout f2 f3) ;this form is equivalant and shows the lists for f1, f2, f3. (-> expr ; expr treaded into first form (f1 ) ; | result threaded into next form (f2 ) ; | and so on... (f3 )) ; V the lists (f1 (f3 (f2 (f1 expr))) ;the result is the same as this

Aquí hay unos ejemplos:

(-> 41 inc dec inc) ;same as (inc (dec (inc 41))) 42 (-> 41 ;same as above but more readable (inc ) (dec ) (inc )) 42 (inc (dec (inc 41))) ;easier to see equivalence with above form. 42 (-> 4 (* 4 3) (- 6)) ;same as (- (* 4 3 4) 6) 42 (-> 4 ; 4 (* 3 4) ; (* 4 3 4) (- 6)) ;(- (* 4 3 4) 6) 42 (- (* 4 3 4) 6) ;easier to see equivalence with above form. 42


Puedes verlo por ti mismo:

(macroexpand `(-> 42 inc dec))


Se llama el operador de la candidiasis. Se explica mejor here .