【问题标题】:Clojure threading first macro -> with Math/pow or any other multiple args functionClojure 线程化第一个宏 -> 使用 Math/pow 或任何其他多参数函数
【发布时间】:2015-04-27 13:25:20
【问题描述】:

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

(-> 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) 工作正常。

更普遍的问题是如何使用 -> with 接受多个参数的函数,即如何使这项工作(-> 10 #(+ % 10))

【问题讨论】:

    标签: clojure macros


    【解决方案1】:

    -> 将之前的结果作为第一个参数插入,->> 将之前的结果作为最后一个参数插入。

    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
    

    【讨论】:

      【解决方案2】:

      电话只是

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-07
          • 1970-01-01
          • 2012-05-13
          • 2019-06-09
          • 2020-05-18
          • 2017-12-08
          • 1970-01-01
          • 2020-04-11
          相关资源
          最近更新 更多