Clojure 如何使用传感器从另一个通道创建通道?
我想从另一个只过滤特定消息的频道创建一个Clojure 如何使用传感器从另一个通道创建通道?,clojure,core.async,transducer,Clojure,Core.async,Transducer,我想从另一个只过滤特定消息的频道创建一个clojure.core.async。因此,我找到了一个名为filter(defc1(chan))的函数 =>(def c2(过滤器(放置!c1 1) =>(放置!c1 2) => ( 但该函数及其好友被标记为已弃用: 不推荐使用-此功能将被删除。请改用传感器 有一些方法可以使用带有传感器的通道,如带有xform参数的chan。如何使用传感器从现有通道构建新通道?我对此做了一些研究,找到了一些有趣的文章(和),然后使用 然后,您可以简单地将频道与 (def
clojure.core.async
。因此,我找到了一个名为filter(defc1(chan))的函数
=>(def c2(过滤器<偶数?c1))
=>(放置!c1 1)
=>(放置!c1 2)
=> (
但该函数及其好友被标记为已弃用:
不推荐使用-此功能将被删除。请改用传感器
有一些方法可以使用带有传感器的通道,如带有
xform
参数的chan
。如何使用传感器从现有通道构建新通道?我对此做了一些研究,找到了一些有趣的文章(和),然后使用
然后,您可以简单地将频道与
(def c1 (chan))
(def c2 (add-transducer c1 (filter even?))
要完成答案,您可以以类似的方式使用管道:
(defn pipe-trans
[ci xf]
(let [co (chan 1 xf)]
(pipe ci co)
co))
(def c1 (chan))
(def c2 (pipe-trans c1 (filter even?)))
受你的启发,我用
pipe
创建了一个facory方法(defn from chan[ci xf](let[co(chan 1 xf)](pipe ci co)co))很好,很高兴我能提供帮助。我添加了你的工厂方法的一个版本,以尝试完成答案,以防其他人搜索它。注意:似乎pipe trans可以简化为(定义管道传输[ci xf](管道传输(chan 1 xf)))但它没有文档记录
(defn ncpus []
(.availableProcessors (Runtime/getRuntime)))
(defn parallelism []
(+ (ncpus) 1))
(defn add-transducer
[in xf]
(let [out (chan (buffer 16))]
(pipeline (parallelism) out xf in)
out))
(def c1 (chan))
(def c2 (add-transducer c1 (filter even?))
(defn pipe-trans
[ci xf]
(let [co (chan 1 xf)]
(pipe ci co)
co))
(def c1 (chan))
(def c2 (pipe-trans c1 (filter even?)))