造成这种差异的原因是,当您comp
与引导任务一起使用时,它们不是组成的裸逻辑,而是每个引导任务返回一个稍后将调用的函数,并且该函数包装另一个传递给它的函数(如在 ring中间件)。
使用普通函数,它的工作方式如下:
(comp inc dec)
产生一个函数,它执行以下操作:
(inc (dec n))
启动任务类似于环中间件。每个任务都是一个函数,它返回另一个函数,该函数将包装管道中的下一个处理程序。它是这样工作的(不是字面意思,为了便于阅读,它被简化了):
(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
所以当你这样做时:
(comp (task1) (task2))
并执行这样的组合任务,它的工作方式就像是:
(fn [fileset1]
(print 1)
((fn [fileset2]
(print 2)
(next-handler fileset2))
fileset1))
因为产生的函数(task2)
将被传递给产生的函数,(task1)
该函数将包装来自的函数(task2)
(并在打印后调用它1
)。
您可以在其 wiki中阅读有关引导任务剖析的更多信息。阅读ring middleware可能也很有用。