Pregunta

Parece ser una macro poderosa, pero no puedo aplicarla a nada que no sean ejemplos tontos. ¿Me puede mostrar algún uso real de ella?

¡Gracias!

¿Fue útil?

Solución

Comparar:

user> (:baz (:bar (:foo {:foo {:bar {:baz 123}}})))
123
user> (java.io.BufferedReader. (java.io.FileReader. "foo.txt"))
#<BufferedReader java.io.BufferedReader@6e1f8f>
user> (vec (reverse (.split (.replaceAll (.toLowerCase "FOO,BAR,BAZ") "b" "x") ",")))
["xaz" "xar" "foo"]

a:

user> (-> {:foo {:bar {:baz 123}}} :foo :bar :baz)
123
user> (-> "foo.txt" java.io.FileReader. java.io.BufferedReader.)
#<BufferedReader java.io.BufferedReader@7a6c34>
user> (-> "FOO,BAR,BAZ" .toLowerCase (.replaceAll "b" "x") (.split ",") reverse vec)
["xaz" "xar" "foo"]

- > se usa cuando desea una forma concisa de anidar llamadas. Le permite enumerar las llamadas en el orden en que se llamarán en lugar de adentro hacia afuera, lo que puede ser más legible. En el tercer ejemplo, observe cuánta distancia hay entre algunos de los argumentos y la función a la que pertenecen; - > le permite agrupar argumentos y llamadas a funciones de forma más limpia. Debido a que es una macro, también funciona para llamadas Java, lo cual es bueno.

- > no es tan poderoso, solo le ahorra algunos padres de vez en cuando. Usarlo o no es una cuestión de estilo y legibilidad.

Mire la parte inferior de clojure.zip para ejemplos extremos de cómo esto es útil.

(-> dz next next next next next next next next next remove up (append-child 'e) root)

Otros consejos

Tomado del wiki siempre he encontrado este ejemplo impresionante:

user=> (import '(java.net URL) '(java.util.zip ZipInputStream))
user=> (-> "http://clojure.googlecode.com/files/clojure_20081217.zip"
           URL. .openStream ZipInputStream. .getNextEntry bean :name)

Como dijo Brian, no es "útil" sino "estilo diferente". Encuentro que para toda la interoperabilidad de Java esta forma de 'comenzar con X' luego hacer Y y Z ... más legible que hacer Z a Y de X.

Básicamente tienes 4 opciones:

; imperative style named steps:
(let [X something
      b (Y X)
      c (Z b)] c)

; nested calls
(Z (Y X))

; threaded calls
(-> X Y Z)

; functional composition
((comp Z Y) X)

Encuentro - > realmente brilla para la interoperabilidad de Java, pero evítalo en otro lugar.

(defn search-tickets-for [term]
  (-> term search zip-soup first :content
    ((partial filter #(= :body (:tag %)))) first :content
    ((partial filter #(= :div (:tag %))))
    ((partial filter #(= "content" ((comp :id :attrs) %))))
    ((partial map :content)) first ((partial map :content))
    ((partial map first)) ((partial filter #(= :ul (:tag %)))) first :content
    ((partial map :content))
    ((partial map first))
    ((partial mapcat :content))
    ((partial filter #(= :h4 (:tag %))))
    ((partial mapcat :content))
    ((partial filter #(= :a (:tag %))))
    ((partial mapcat :content))))

clojurebot de #clojure usa esto para buscar tickets de ensamblaje

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top