Clojure core.async是否可以按照顺序实现其功能?
告诉我们Clojure 1.6中有两个Clojure core.async是否可以按照顺序实现其功能?,clojure,sequence,core.async,transducer,Clojure,Sequence,Core.async,Transducer,告诉我们Clojure 1.6中有两个map的实现,一个用于Clojure.core中的序列,另一个用于core.async中的通道 现在我们知道在1.7中我们有传感器,当给定一个函数而不是一个集合时,foldr(reduce)函数从高阶函数(如map和filter)返回 我想说的是,为什么core.async函数不能返回序列,或者像Seq一样。我有一种感觉,“接口”(协议)是不同的,但我不知道如何 当然,如果你从一个频道中删除第一个项目,那么你可以将其表示为从一个序列中删除第一个项目 我的问
map
的实现,一个用于Clojure.core
中的序列,另一个用于core.async
中的通道
现在我们知道在1.7中我们有传感器,当给定一个函数而不是一个集合时,foldr
(reduce
)函数从高阶函数(如map
和filter
)返回
我想说的是,为什么core.async
函数不能返回序列,或者像Seq
一样。我有一种感觉,“接口”(协议)是不同的,但我不知道如何
当然,如果你从一个频道中删除第一个项目,那么你可以将其表示为从一个序列中删除第一个项目
我的问题是:是否可以
core.async
以序列的形式实现其功能?是的,从某种意义上说,它们可能已经实现了。如果您忽略go块(目前让我们这样做),那么下面的内容实际上没有什么问题:
(defn chan-seq [ch]
(when-some [v (<!! c)]
(cons v (lazy-seq (chan-seq ch)))))
(defn chan seq[ch]
(当一些(
但是请注意这里的调用。这被称为“take blocking”:在这个函数中有一些承诺和锁,这些承诺和锁将导致当前正在执行的线程停止,直到通道上有一个值可用。因此,如果您不介意让Java线程坐在那里什么也不做,这将很好
go块背后的想法是使逻辑进程更便宜;为了实现这一点,go块将块体重写为一系列连接到通道的回调,以便在内部对go块中的的调用变成类似这样的(take!c k)
其中k
是对go块其余部分的回调
现在,如果我们有真正的延续,或者JVM支持轻量级线程,那么是的,我们可以将go块和阻塞相结合或者一些非标准的JVM特性。在创建core.async时,这两个选项都被排除在外,取而代之的是更简单的本地go块转换的实现(希望更简单的推理)