我惊奇地发现没有人提到 as->
是设计来在 ->
内部工作的(threading macros 都是设计在 ->
内部工作的)。阅读其他人的答案,以下是我的预期:
(-> 2
(+ 1)
(as-> x (* 2 x)) ; or just (->> (* 2))
(range))
(-> thing
(->> (fn2 bleh)) ; or (as-> x (fn2 bleh x))
(fn3 blah))
如您所见,as->
的参数顺序——表达式符号体——使其适合进行线程化,但在这两种情况下,您可以直接从->
变为->>
,在表单末尾获得线程化值。
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))