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_Core.async - Fatal编程技术网

Clojure,如何从到达core.async聚合器的元素创建向量

Clojure,如何从到达core.async聚合器的元素创建向量,clojure,core.async,Clojure,Core.async,我已经跟踪了,并且正在将称为段的内容发送到聚合器。这些片段都到达了,我可以在它们到达时打印出来。但我想做的是在它们到达时从它们中生成一个不可变的数据结构(向量)。或者甚至等待它们全部到达,然后生成向量。我可以知道最后一个什么时候到,然后把它们分类。我需要将到达的段连接到现有的到目前为止构建的向量。我习惯于使用函数调用的返回来创建这样的向量,但我看不出这个工具在线程或go块中如何可用。假设,由于您能够接收多个项,因此异步代码已经在循环中 为了从您获得的项构建向量,您应该使用循环绑定 (def ac

我已经跟踪了,并且正在将称为段的内容发送到聚合器。这些片段都到达了,我可以在它们到达时打印出来。但我想做的是在它们到达时从它们中生成一个不可变的数据结构(向量)。或者甚至等待它们全部到达,然后生成向量。我可以知道最后一个什么时候到,然后把它们分类。我需要
将到达的段连接到现有的到目前为止构建的向量。我习惯于使用函数调用的返回来创建这样的向量,但我看不出这个工具在线程或go块中如何可用。

假设,由于您能够接收多个项,因此异步代码已经在循环中

为了从您获得的项构建向量,您应该使用循环绑定

(def acc-chan
  (>/go-loop [accumulator []]
      (let [item (>/<! source-chan)]
        (if (nil? item)
          accumulator
          (recur (conj accumulator item)))))
(def acc chan)
(>/go循环[累加器[]]
(让[项目]/

go循环
调用将立即返回一个acc chan,它将接收循环的返回值(累加器)当循环退出时。累加器在循环的每次迭代中都被重新绑定,在末尾添加另一项。当源关闭时,累加器从循环返回,并放置在
acc chan
上,您可以读取它并使用该值。

另一个选项是使用。与其他“减速机通道”一样在async toolkit中,它还基于这样一个假设:当您准备好接收结果时,您将
关闭源通道。

因此,我需要知道何时以及如何显式关闭
源通道
,以便实现零,然后我将能够从acc chan中检索到什么,这将不会发生是的。你可以使用
.close
方法,也可以只在频道上写一个
nil
。另外,我刚刚在nil检查中纠正了一个拼写错误。谢谢。我创建了聚合器(你的acc chan)与预期大小一致,并在达到该大小时返回最后一个
conj
,而不是显式关闭任何频道。这不是聚合器chan,所以“((clojure.core.async/into[]aggregator chan)”。结果就是这样结束的?如果您同意只进行编辑,那么我将删除此注释。不,
into
(如
reduce
,它是在上面实现的)将要从中获取的源通道作为参数并返回聚合器chan。在源通道关闭后,聚合器仅输出1个值。(好的,使用
reduce
您的还原功能也可以在查看所有值之前使用
reduced
来短路还原)