考虑以下代码片段:
(require '[clojure.core.async :refer :all])
(def my-chan (chan (buffer 10)))
(go (while true
(>! my-chan (rand))))这基本上提供了一个缓冲通道,它总是包含大约10个随机数。当通道被消耗时,缓冲区再次被填满。
在core.async中对此有抽象吗?由于有用于操纵通道消耗的换能器,因此也可能有用于生产它们的东西:
对于序列,人们可能会选择如下所示:
(def my-seq
(map (fn [_] (rand)) (range)))或者,只是:
(def my-seq (repeatedly rand))这当然不是缓冲的,但它可能会给我一个想法,我正在寻找什么。
发布于 2017-03-06 06:24:21
传感器不会操纵通道的消耗--它们会影响值,但不会影响通道上数据的消耗。
您似乎在询问一种方法来抽象通道的创建,然后以序列的形式从中获取值。这里有一些想法,尽管我不相信在这种情况下core.async真的提供了超出正常clojure.core功能的任何东西。
抽象在这里是以通常的方式完成的--使用函数。这将调用f并将其结果放到通道上。这里的含义当然是f将是副作用和不纯的,否则它将是一个相当无聊的消费渠道,每个值都是相同的。
(defn chan-factory
[f buf]
(let [c (chan buf)]
(go-loop []
(>! c (f))
(recur))
c))如果你想由此创建一个惰性序列,你可以这样做:
(defn chan-to-seq [c]
(lazy-seq
(cons (<!! c) (chan-to-seq c))))定义您的序列:
(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)但是,您可以通过执行以下操作来完成相同的任务:
(def rand-nums (repeatedly rand))因此,虽然你正在做的是一个伟大的思想实验,但找到一些具体的用例可能更有帮助,然后你可能会收到更具体的想法。祝好运!
https://stackoverflow.com/questions/42612915
复制相似问题