Сравнить:
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"]
до:
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"]
->
используется, когда требуется краткий способ вложения вызовов. Это позволяет вам перечислить вызовы в порядке их вызова, а не наизнанку, что может быть более читабельным. В третьем примере обратите внимание на расстояние между некоторыми аргументами и функцией, к которой они принадлежат; ->
позволяет более аккуратно группировать аргументы и вызовы функций. Поскольку это макрос, он также работает для вызовов Java, что приятно.
->
не такой мощный, просто время от времени экономит вам несколько паренов. Использовать его или нет - это вопрос стиля и читабельности.
Посмотрите на нижнюю часть clojure.zip , чтобы найти примеры того, как это полезно.
(-> dz next next next next next next next next next remove up (append-child 'e) root)