clojure线程运算符

Kev*_*vin 6 clojure

让我们说我想使用线程运算符通过一系列函数调用来线程化地图.所有函数都将map作为第一个参数(好),但是一个函数不符合正确的签名(比如它将map作为最后一个参数)."修复"功能签名的最佳方法是什么?

Pau*_*aul 8

#()匿名函数的读者宏是一个很好的候选者:

(-> your-arg
  (fn1 arg2 arg3)
  (fn2 arg4 arg5)
  (#(fn3 arg6 arg7 %)) )
Run Code Online (Sandbox Code Playgroud)

它非常灵活,几乎没有视觉噪音.你当然可以做很多不同的事情,在这种情况下,部分功能应用程序也可以工作:

(-> your-arg
  (fn1 arg2 arg3)
  ((partial fn2 arg4 arg5)))
Run Code Online (Sandbox Code Playgroud)

还有一个->>宏将第一个表达式线程化到最后一个位置.当然在你的用例中这没有多大帮助,因为你必须调整一些函数调用.但是,如果你链接许多函数,应该将表达式作为第一个参数,然后许多函数将表达式作为最后一个参数,你可以做类似的事情

(->>
  (-> your-arg
    (fn1 arg2 arg3)
    (fn2 arg5 arg6))
  (fn3 arg7 arg8)
  (fn4 arg10 arg11))
Run Code Online (Sandbox Code Playgroud)

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


Mri*_*abh 6

我认为人们往往低估了clojure中可用的线程操作符.那么让我向您介绍as->线程运算符.

as->线程创建一个变量,该变量在线程步骤中获取每个函数调用的值.例,

(as-> 2 x        ;; x = 2
      (+ 3 x)    ;; x = 5
      (- x 1)    ;; x = 4
      (/ x 2)    ;; x = 2
      (+ x x x)) ;; x = 6
Run Code Online (Sandbox Code Playgroud)

上述操作的输出为x即6.