Clojure - 当“comp”从右向左移动时,这是如何工作的?

Clojure - How does this work when `comp` goes from right to left?

comp 的文档指出它从最右边的函数开始,将参数应用于它,然后将结果提供给下一个函数,依此类推。因此,这里先添加数字,然后将 str 应用于整数 16:

((comp str +) 8 8) ;;=> "16"

此代码来自 core.async webinar:

中的示例 7
mouse (events->chan js/window EventType.MOUSEMOVE
       (chan 1 
       (comp (map mouse-loc->vec) 
             (filter (fn [[_ y]] (zero? (mod y 5)))))))

此处鼠标事件流是参数。它们首先被转换成一对(元组 2 向量),然后过滤这些对。 map 函数(恰好是一个转换器)需要在 filter 函数之前接收鼠标事件,显然这就是实际发生的情况,因为这段代码有效。那么为什么第一个操作(map 函数)不是 comp 最右边的函数参数?

答案 在 25:30 的 video 中,Rich Hickey 说 "transducers ruin comp or something like that" - 之后他解释了这个问题。谢谢@nblumoe

这是传感器文档中的一个片段,解释了行为:

Composition of the transformer runs right-to-left but builds a transformation stack that is applied left-to-right

http://clojure.org/transducers(参见"Defining Transformations with transducers")