假设我想使用线程运算符通过一系列函数调用来对地图进行线程化。所有函数都将map作为第一个参数(好),但是一个函数不符合正确的签名(比如它将map作为最后一个参数)。 “修复”功能签名的最佳方法是什么?
答案 0 :(得分:8)
匿名函数的读者宏#()
是一个很好的候选者:
(-> your-arg
(fn1 arg2 arg3)
(fn2 arg4 arg5)
(#(fn3 arg6 arg7 %)) )
它很灵活,几乎没有视觉噪音。你当然可以做很多不同的事情,在这种情况下,部分功能应用程序也可以工作:
(-> your-arg
(fn1 arg2 arg3)
((partial fn2 arg4 arg5)))
还有->>
宏将第一个表达式线程化到最后一个位置。当然在你的用例中这没有多大帮助,因为你必须调整一些函数调用。但是,如果你链接许多应该将表达式作为第一个参数的函数,然后是许多将表达式作为最后一个参数的函数,你可以做类似的事情
(->>
(-> your-arg
(fn1 arg2 arg3)
(fn2 arg5 arg6))
(fn3 arg7 arg8)
(fn4 arg10 arg11))
编辑:在第一个例子中添加了额外的括号。
答案 1 :(得分:6)
我认为人们倾向于低估clojure中可用的线程运算符的类型。那么让我向您介绍as->线程运算符。
as-> thread创建一个变量,该变量在线程步骤中获取每个函数调用的值。例如,
(as-> 2 x ;; x = 2
(+ 3 x) ;; x = 5
(- x 1) ;; x = 4
(/ x 2) ;; x = 2
(+ x x x)) ;; x = 6
上述操作的输出为x,即6。
答案 2 :(得分:1)
(-> your-arg
(fn1 arg2 arg3)
(fn2 arg5 arg6)
(->> (fn3 arg7 arg8)
(fn4 arg10 arg11)))
对于我来说,似乎比“->>
之前的版本->
更好”。您可以做的另一件事是编写一些基本的参数重新排序函数,并使用它们创建fn3
和fn4
的版本,以您想要的顺序获取它们的参数。