I keep coming back to this example from the thread-last docs:
;; An example of using the "thread-last" macro to get ;; the sum of the first 10 even squares. (->> (range) (map #(* % %)) (filter even?) (take 10) (reduce +))
Now, I know you're always doing TDD and therefore, never need to avial yourself of any primitive debugging, but let's say a friend is in trouble and you want to help them out (before you do them an even bigger favor by teaching them TDD). So, you'd like to see, a word which here means invoke
println on, the value of one of the intermediate transformations in the above threading operation.
(->> (range) (map #(* % %)) (filter even?) (take 10) (println) ;; returns nil :( (reduce +))
This does output the value of the intermediate transformation at the point of the
(println), but it also results in
(reduce + nil). This isn't catastrophic in this example, but bear with me.
Let's refactor to the 'thread-last' macro:
(as-> (range) $ (map #(* % %) $) (filter even? $) (take 10 $) (reduce + $))
...which allows us to insert
(do (println $) $) at any point without disturbing the threading of existing results through the forms. (Just don't insert it before the
take 10 operation...)
(as-> (range) $ (map #(* % %) $) (filter even? $) (take 10 $) (do (println $) $) ;; OUTPUT: (0 4 16 36 64 100 144 196 256 324) (reduce + $) (do (println $) $)) ;; OUTPUT: 1140