我惊愕没有人提到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))