3

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

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

此代码来自core.async 网络研讨会中的示例 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 的视频中,Rich Hickey 说“传感器损坏comp或类似的东西”——然后他解释了这个问题。谢谢@nblumoe

4

1 回答 1

3

这是转换器文档中的一个片段,解释了该行为:

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

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

于 2015-11-09T05:47:53.830 回答