haw*_*eye 8 clojure sequence transducer core.async
Rich Hickey的Strange Loop传感器演示告诉我们mapClojure 1.6 中有两个实现,一个用于序列输入clojure.core,一个用于通道core.async.

现在我们知道,在1.7,我们有传感器,对于其中foldr(reduce)函数是从高阶功能,如返回map和filter给定功能,但不是一个集合的时候.
我试图表达和失败的是,为什么core.async函数不能返回一个序列,或者是类似Seq的.我有一种感觉,'接口'(协议)是不同的,但我看不出如何.
当然,如果您从频道中取出第一个项目,那么您可以将其表示为从序列中取出第一个项目吗?
我的问题是:能否core.async在序列方面实现其功能?
是的,从某种意义上说,他们本来可以.如果你忽略了去块(暂时让我们这样做),那么下面的内容确实没什么问题:
(defn chan-seq [ch]
(when-some [v (<!! c)]
(cons v (lazy-seq (chan-seq ch)))))
Run Code Online (Sandbox Code Playgroud)
但请注意这里的<!!电话.这称为"阻塞":在此函数内部是一些promise和lock,它们将导致当前正在执行的线程停止,直到通道上有值.因此,如果您不介意让Java线程无所事事,那么这样可以正常工作.
go块背后的想法是使逻辑过程更便宜; 为了实现这一点,go块将块的主体重写为一系列附加到通道的回调,以便内部对<!go块内部的调用变为类似这样的内容(take! c k),其中k是对其余部分的回调.去块.
现在,如果我们有真正的延续,或者JVM支持轻量级线程,那么是的,我们可以组合go-blocks和阻塞.但目前这涉及深度字节码重写(如Pulsar/Quasar项目)或某些非标准JVM功能.这两个选项都在core.async的创建中被排除,有利于实现更简单(并且希望更容易推理)本地块转换.