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
来短路还原)