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?)))