我惊讶没有人提到as->
是为了在->
(所有threading宏都是在->
内操作的)中使用而设计的。在阅读其他人的回答时,以下是我所期望的
(-> 2
(+ 1)
(as-> x (* 2 x)) ; or just (->> (* 2))
(range))
(-> thing
(->> (fn2 bleh)) ; or (as-> x (fn2 bleh x))
(fn3 blah))
如你所见,as->
的参数顺序expr symbol body非常适合threading,但在这两种情况下,你只需从->
thread到->>
,就可以在形式末尾获得threaded值。
as->
在你只有一到两个形式而不想在开始或结尾处使用线程值的情况下,作用尤为明显。
(-> thing
(fn1 arg2 arg3)
(+ 13)
(as-> q (fn2 arg1 q arg3))
(fn3 second-arg))
或者,你可能需要一个 let
用于解构或其他目的。
(-> foo
(processs-it :expand)
(as-> m (let [{:keys [start end]} m]
(- end start)))
(categorize-interval))