我很惊讶没有人提到,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,但在这两种情况下,你只需要从 ->
纸线程到 ->>
,就可以在表尾得到threaded值。
当你在一条通常是直线线程中只有一个或两个表单,且不想在开头或结尾进行threading时,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))