Clojure threading first macro->with Math/pow或任何其他多参数函数

Clojure threading first macro->with Math/pow或任何其他多参数函数,clojure,macros,Clojure,Macros,如何在一行中编写以下代码: (-> 10 pow9) 其中,pow9是: (def pow9 (partial #(Math/pow % 9))) 如果我写->10部分数学/pow%9,我将取而代之, 写入->10 Math/pow%9失败,编译器异常为java.lang.ClassCastException:java.lang.Long无法转换为clojure.lang.ISeq,编译:无源路径:1:1 虽然->10 pow9可以正常工作 更一般的问题是如何将->与接受多个参数的函数

如何在一行中编写以下代码:

(-> 10 pow9)
其中,pow9是:

(def pow9 (partial #(Math/pow % 9)))
如果我写->10部分数学/pow%9,我将取而代之, 写入->10 Math/pow%9失败,编译器异常为java.lang.ClassCastException:java.lang.Long无法转换为clojure.lang.ISeq,编译:无源路径:1:1

虽然->10 pow9可以正常工作

更一般的问题是如何将->与接受多个参数的函数一起使用,即如何使其工作->10+%10?

调用非常简单

user=> (-> 10 (Math/pow 9))
1.0E9
因为->threading宏将结果作为第一个参数发送。

调用非常简单

user=> (-> 10 (Math/pow 9))
1.0E9
因为->threading宏将结果作为第一个参数发送。

->将上一个结果作为第一个参数插入,->>将上一个结果作为最后一个参数插入

注意额外的参数

实际上,在这里您根本不需要部分:

user=> (defn pow9 [x] (Math/pow x 9))
#'user/pow9
user=> (-> 10 pow9)
1.0E9
->将上一个结果作为第一个参数插入,->>将上一个结果作为最后一个参数插入

注意额外的参数

实际上,在这里您根本不需要部分:

user=> (defn pow9 [x] (Math/pow x 9))
#'user/pow9
user=> (-> 10 pow9)
1.0E9

如果希望以线程项作为参数调用匿名函数,则需要在其周围设置另一组参数:

 (-> 10 (#(Math/pow % 9)))

这是因为宏在函数定义或部分应用程序或任何您正在执行的操作得到计算之前插入项

如果希望以线程项作为参数调用匿名函数,则需要另一组参数:

 (-> 10 (#(Math/pow % 9)))
这是因为宏在函数定义或部分应用程序或任何您正在执行的操作得到计算之前插入项