Translations: [日本語]
On page 109 of Paul Graham’s
ANSI Common Lisp he describes a function compose
taken from the Dylan programming
language. The function described is very similar to the ->
macro that
often confuses many a new Clojurian. In order to better understand this
little nasty, I’ve found it useful to think of it as an arrow indicating
the flow of data from one function to another. That is, the follow:
(-> (Math/sqrt 25) int list)
Can literally be read:
(Math/sqrt 25)
int
list
Graphically, this can be viewed as:
(Math/sqrt 25) --5.0--> (int 5.0) --5--> (list 5)
=> (5)
Which expands into the following s-expression:
(list (int (Math/sqrt 25)))
When viewed this way, the ->
macro can be said to
“thread” 1 a sequence of forms into each in
turn. This threading can be done within any form and is always
stitched in as the second argument to the outermost s-expression.
Clojurians will sometimes use the comma 2 as
a visual marker for the stitch point:
(-> (/ 144 12) (/ ,,, 2 3) str keyword list)
=> (:2)
(-> (/ 144 12) (* ,,, 4 (/ 2 3)) str keyword (list ,,, :33))
=> (:32 :33)
Unfortunately, the documentation for ->
does not do
justice to its power, but hopefully things are a little more clear
now.
-m