clojure线程运算符



假设我想使用线程运算符通过一系列函数调用来线程化映射。所有函数都将映射作为第一个参数(好(,但有一个函数不符合正确的签名(比如将映射作为最后一个参数(。"修复"函数签名的最佳方法是什么?

用于匿名函数的读取器宏#()在这里是一个很好的候选者:

(-> 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))

编辑:在第一个例子中添加了额外的括号。

我认为人们往往低估了clojure中可用的线程运算符的种类。因此,让我向您介绍as->threading操作符。

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。

(-> your-arg
    (fn1 arg2 arg3)
    (fn2 arg5 arg6)
    (->> (fn3 arg7 arg8)
         (fn4 arg10 arg11)))

对我来说,这似乎比->之前的->>版本更好。你可以做的另一件事是编写一些基本的参数重新排序函数,并使用这些函数创建fn3fn4的版本,按照你想要的顺序接受它们的参数。

最新更新