从 Clojure 1.5 开始,您还可以使用新的线程宏之一。
clojure.core/as->
([expr name & forms])
宏
将 name 绑定到 expr,计算该绑定的词法上下文中的第一个表单,然后将 name 绑定到该结果,对每个后续表单重复,返回最后一个表单的结果。
这是一个相当新的结构,所以还不知道如何习惯性地使用,但我想这样的事情会做:
(as-> "test test test" s
(str/split s #" ")
(modification-1 s)
(modification-2 s)
...
(modification-n s)
(str/join "\n" s))
编辑
至于为什么论点立场不同,我无处可说,但我认为亚瑟的建议是有道理的:
- 一些函数显然对集合(
map
、、reduce
等)进行操作。这些倾向于始终将集合作为最后一个参数,这意味着它们可以很好地与->>
- 有些函数不对集合进行操作,并且倾向于将最重要的参数(这是一件事吗?)作为第一个参数。例如,在使用时,
/
我们希望分子排在第一位。这些功能最适用于->
问题是 - 有些功能是模棱两可的。他们可能会获取一个集合并生成一个值,或者获取一个值并生成一个集合。string\split
是一个例子(暂时忽略字符串可能被认为是单个值或集合的额外混淆)。串联/减少操作也可以做到——它们会弄乱你的管道!
例如,考虑:
(->> (range 1 5)
(map inc)
(reduce +)
;; at this point we have a single value and might want to...
(- 4)
(/ 2))
;; but we're threading in the last position
;; and unless we're very careful, we'll misread this arithmetic
在这些情况下,我认为类似的东西as->
真的很有帮助。
我认为总的来说,->>
在对集合进行操作时使用的指导方针->
是合理的——只是在这些边界/模棱两可的情况下,as->
可以使代码更整洁、更清晰。