Clojure - arrow
The arrow is used as a more readable way of piping a value through a number of forms, usually a function, in Clojure.
(->> 10 (inc) (str)) ; "11"
The first argument to ->>
, 10
, is given as the last argument to the first form, (inc)
. So it expands to (inc 10)
. The result of the first form is passed as the last argument to the second form and so on for further forms.
It is the same as (str (inc 10))
.
It is a pipeline.
Another example using a collection as the input and map:
(->> [1 2 3] (map inc)) ; [2 3 4]
(->> [1 2 3] (map inc) (map str)) ; ("2" "3" "4")
(def times-ten (partial * 10))
(->> [1 2 3] (map inc) (map times-ten) (map str))
; ("20" 30" "40")
Note partial
returns a new function with some of the arguments already applied.
One more example:
(->> [1 2 3] (map inc) (map times-ten) (reduce +) (str))
; "90"
Note after the reduce
we have a number value not a collection.
It is expanded to:
(str ; "90"
(reduce + ; 90
(map times-ten ; (20 30 40)
(map inc [1 2 3]) ; (2 3 4)
)
)
)