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