为什么clojure引导中任务的执行顺序会改变?

为什么clojure引导中任务的执行顺序会改变?,clojure,function-composition,boot-clj,Clojure,Function Composition,Boot Clj,如果在任务上使用comp,则执行顺序是从左到右。如果我在匿名函数上使用comp,执行顺序是从右到左。这种不一致性如何合理?造成这种差异的原因是,当您将comp与引导任务一起使用时,它们不是组成的裸逻辑,但每个引导任务都返回一个函数,稍后将调用该函数,该函数包装另一个传递给它的函数,就像在环形中间件中一样 对于普通函数,其工作原理如下: 康普公司 生成执行以下操作的函数: 有限公司 引导内任务类似于环形中间件。每个任务都是一个函数,它返回另一个函数,该函数将包装管道中的下一个处理程序。它的工作原理

如果在任务上使用comp,则执行顺序是从左到右。如果我在匿名函数上使用comp,执行顺序是从右到左。这种不一致性如何合理?

造成这种差异的原因是,当您将comp与引导任务一起使用时,它们不是组成的裸逻辑,但每个引导任务都返回一个函数,稍后将调用该函数,该函数包装另一个传递给它的函数,就像在环形中间件中一样

对于普通函数,其工作原理如下:

康普公司

生成执行以下操作的函数:

有限公司

引导内任务类似于环形中间件。每个任务都是一个函数,它返回另一个函数,该函数将包装管道中的下一个处理程序。它的工作原理是这样的,不是字面上的,为了可读性,它被简化了:

(deftask test1 "first test task" [] (print "1") identity)
(deftask test2 "second test task" [] (print "2") identity)
(boot (comp (test1) (test2)))
=> 12nil
(boot (comp (fn [x] (print "1") identity) (fn [x] (print "2") identity)))
=> 21nil
所以当你这样做的时候:

薪酬任务1任务2

并执行这样的组合任务,它的工作方式就像:

(defn task1 []
  (fn [next-handler]
    (fn [fileset]
      (print 1) ;; do something in task1
      (next-handler fileset))) ;; and call wrapped handler

(defn task2 []
  (fn [next-handler]
    (fn [fileset]
      (print 2) ;; do something in task1
      (next-handler fileset)))) ;; and call wrapped handler
因为task2生成的函数将传递给task1生成的函数,后者将包装task2生成的函数,并在打印1后调用它


您可以在中阅读有关引导任务的更多信息。继续阅读可能也很有用。

造成这种差异的原因是,当您将comp与引导任务一起使用时,它们不是组成的裸逻辑,而是每个引导任务返回一个函数,稍后将调用该函数,该函数包装另一个传递给它的函数,就像在环中间件中一样

对于普通函数,其工作原理如下:

康普公司

生成执行以下操作的函数:

有限公司

引导内任务类似于环形中间件。每个任务都是一个函数,它返回另一个函数,该函数将包装管道中的下一个处理程序。它的工作原理是这样的,不是字面上的,为了可读性,它被简化了:

(deftask test1 "first test task" [] (print "1") identity)
(deftask test2 "second test task" [] (print "2") identity)
(boot (comp (test1) (test2)))
=> 12nil
(boot (comp (fn [x] (print "1") identity) (fn [x] (print "2") identity)))
=> 21nil
所以当你这样做的时候:

薪酬任务1任务2

并执行这样的组合任务,它的工作方式就像:

(defn task1 []
  (fn [next-handler]
    (fn [fileset]
      (print 1) ;; do something in task1
      (next-handler fileset))) ;; and call wrapped handler

(defn task2 []
  (fn [next-handler]
    (fn [fileset]
      (print 2) ;; do something in task1
      (next-handler fileset)))) ;; and call wrapped handler
因为task2生成的函数将传递给task1生成的函数,后者将包装task2生成的函数,并在打印1后调用它


您可以在中阅读有关引导任务的更多信息。继续阅读也可能有用。

谢谢!你的解释很好!请你修改一下你的答案,从这是执行的顺序开始?我还是不确定,但我认为comp task1 task2的意思是task1 task2?谢谢!你的解释很好!请你修改一下你的答案,从这是执行的顺序开始?我还是不确定,但我认为comp task1 task2的意思是task1 task2?