迭代core.async通道进行打印的最佳方法?

时间:2014-10-27 11:49:32

标签: clojure core.async

我正在尝试将core.async通道的结果转储到stdout。

这是我所拥有的(简化示例):

(use 'clojure.core.async)

(def mychan (to-chan (range 100)))

(loop []
  (let [a (<!! mychan)]
    (if (not (nil? a))
      (do  
        (println a)
        (recur)))))

现在我想我应该可以用map替换它:

(map (fn [a] (println a) a) [mychan])

但这似乎是懒惰的,并没有返回任何结果。

我不禁觉得我的循环功能在某种程度上是一种解决方法。我的问题是 - 迭代core.async频道进行打印的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

更好地使用go-loop在go块中运行日志记录过程:

(def c (async/chan 10))
(go-loop []
  (when-let [msg (<! c)]
    (println msg)
    (recur)))
(async/onto-chan c (range 100))

或者您可以在1.7

上使用传感器
(def prn-chan (async/chan 10 (map println)))
(async/onto-chan prn-chan (range 100))