gpt4 book ai didi

clojure - 如何使用传感器创建另一个 channel ?

转载 作者:行者123 更新时间:2023-12-02 04:09:17 26 4
gpt4 key购买 nike

我想从另一个仅过滤特定消息的 channel 创建一个 clojure.core.async channel 。因此我找到了一个名为filter<.

的函数
=> (def c1 (chan))
=> (def c2 (filter< even? c1))
=> (put! c1 1)
=> (put! c1 2)
=> (<!! c2)
2

但是该函数及其友元被标记为已弃用:

Deprecated - this function will be removed. Use transducer instead

有一些方法可以将 channel 与传感器一起使用,例如带有 xform 参数的 chan 。如何使用传感器从现有 channel 构建新 channel ?

最佳答案

我对此做了一些研究,发现了几篇有趣的文章( firstsecond ),然后使用 pipeline 得到了一些工作。

(require '[clojure.core.async :as async :refer [chan <!! pipeline put!]])
(def c1 (chan))
(def c2 (chan))

(pipeline 4 c2 (filter even?) c1)

(put! c1 1)
(put! c1 2)
(<!! c2)
;;=> 2

我链接的第二篇文章通过管道函数周围的一些辅助函数使这变得更加清晰:

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

然后您可以简单地将 channel 绑定(bind)在一起

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

关于clojure - 如何使用传感器创建另一个 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31286167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com