首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Core.Async中的“重复”

Core.Async中的“重复”
EN

Stack Overflow用户
提问于 2017-03-06 03:27:16
回答 1查看 186关注 0票数 2

考虑以下代码片段:

代码语言:javascript
复制
(require '[clojure.core.async :refer :all])


(def my-chan (chan (buffer 10)))

(go (while true
      (>! my-chan (rand))))

这基本上提供了一个缓冲通道,它总是包含大约10个随机数。当通道被消耗时,缓冲区再次被填满。

在core.async中对此有抽象吗?由于有用于操纵通道消耗的换能器,因此也可能有用于生产它们的东西:

对于序列,人们可能会选择如下所示:

代码语言:javascript
复制
(def my-seq 
  (map (fn [_] (rand)) (range)))

或者,只是:

代码语言:javascript
复制
(def my-seq (repeatedly rand))

这当然不是缓冲的,但它可能会给我一个想法,我正在寻找什么。

EN

回答 1

Stack Overflow用户

发布于 2017-03-06 06:24:21

传感器不会操纵通道的消耗--它们会影响值,但不会影响通道上数据的消耗。

您似乎在询问一种方法来抽象通道的创建,然后以序列的形式从中获取值。这里有一些想法,尽管我不相信在这种情况下core.async真的提供了超出正常clojure.core功能的任何东西。

抽象在这里是以通常的方式完成的--使用函数。这将调用f并将其结果放到通道上。这里的含义当然是f将是副作用和不纯的,否则它将是一个相当无聊的消费渠道,每个值都是相同的。

代码语言:javascript
复制
(defn chan-factory
  [f buf]
  (let [c (chan buf)]
    (go-loop []
      (>! c (f))
      (recur))
    c))

如果你想由此创建一个惰性序列,你可以这样做:

代码语言:javascript
复制
(defn chan-to-seq [c]
  (lazy-seq
    (cons (<!! c) (chan-to-seq c))))

定义您的序列:

代码语言:javascript
复制
(def rand-from-chan (chan-to-seq (chan-factory rand 10)))

(take 5 rand-from-chan)
=>
(0.6873518531956767
 0.6940302424998631
 0.07293052906941855
 0.7264083273536271
 0.4670275072317531)

但是,您可以通过执行以下操作来完成相同的任务:

代码语言:javascript
复制
(def rand-nums (repeatedly rand))

因此,虽然你正在做的是一个伟大的思想实验,但找到一些具体的用例可能更有帮助,然后你可能会收到更具体的想法。祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42612915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档