Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure core.async是否可以按照顺序实现其功能?_Clojure_Sequence_Core.async_Transducer - Fatal编程技术网

Clojure core.async是否可以按照顺序实现其功能?

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一样。我有一种感觉,“接口”(协议)是不同的,但我不知道如何 当然,如果你从一个频道中删除第一个项目,那么你可以将其表示为从一个序列中删除第一个项目 我的问

告诉我们Clojure 1.6中有两个
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块转换的实现(希望更简单的推理)