Clojure - 当`comp`从右到左时,它是如何工作的?

时间:2015-11-09 04:27:24

标签: clojure core.async transducer

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最右边的函数参数?

回答video 25:30,Rich Hickey说"传感器毁了comp或类似的东西" - 之后他解释了这个问题。谢谢@nblumoe

1 个答案:

答案 0 :(得分:2)

以下是传感器文档的片段,解释了行为:

  

变压器的组成从右到左运行,但构建了一个从左到右应用的转换堆栈

http://clojure.org/transducers(参见“用换能器定义转换”)