如何使用管道上的传感器创建多个输出?

How to create multiple outputs using a transducer on a pipeline?

我想了解如何设置每个输入有多个输出的 clojure 管道,但到目前为止我还没有成功。

管道的 documentation 表示

[...] the transducer will be applied independently to each element [...] and may produce zero or more outputs per input. [...]

但是,我不明白如何让每个输入获得 1 个以上的输出。

我想对同一个输入应用多个转换,并将所有结果放到输出通道上。我相信这也可以使用 mult, tap and merge 来完成,但是,与向管道传感器添加另一个转换相比,这会引入更多的开销。

我用玩具示例试了一下:

  (def ca (chan))
  (def cb (chan))
  (defn f [in] in)
  (defn g [in] (* 2 in))
  (pipeline 1 cb  (map (juxt f g)) ca)
  (put! ca 1)
  (<!! cb)

但是,这会在单个输出中输出 [1 2],而不是两个单独的输出。

那么:我如何在两个通道之间设置一个 clojure 管道,以便它在输入通道上的每个输入在输出通道上产生多个 (>1) 个输出?

使用 mapcat 而不是 map。区别在于:map是一对一的,而mapcat是一对多的。