Clojure 线程化第一个宏 -> 使用 Math/pow 或任何其他多参数函数

Clojure threading first macro -> with Math/pow or any other multiple args function

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

(-> 10 pow9)

其中 pow9 是:

(def pow9 (partial #(Math/pow % 9)))

如果我写 (-> 10 (partial #(Math/pow % 9))) 我会返回 #<core$partial$fn__4228 clojure.core$partial$fn__4228@62330c23>, 写 (-> 10 #(Math/pow % 9)) 失败 CompilerException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.ISeq, compiling:(NO_SOURCE_PATH:1:1),

尽管 (-> 10 pow9) 工作正常。

更普遍的问题是如何将 -> 与接受多个参数的函数一起使用,即如何使这项工作正常进行 (-> 10 #(+ % 10))?

简单的调用是

user=> (-> 10 (Math/pow 9))
1.0E9

因为 -> 线程宏将结果作为第一个参数发送。

-> 插入前一个结果作为 第一个参数->> 插入前一个结果作为 最后一个参数 .

user=> (-> 10 (Math/pow 9))
1.0E9

user=> (-> 10 ((partial #(Math/pow % 9))))
1.0E9

注意额外的括号。

实际上你根本不需要这里的partial:

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

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

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

这是因为宏在计算函数定义(或部分应用程序,或您正在做的任何事情)之前插入了项目。