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)))
这是因为宏在计算函数定义(或部分应用程序,或您正在做的任何事情)之前插入了项目。
如何在一行中写出以下代码:
(-> 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)))
这是因为宏在计算函数定义(或部分应用程序,或您正在做的任何事情)之前插入了项目。