为什么这个使用 go 块的 clojure 代码不起作用?

Why doesn't this clojure code using go blocks work?

(defn ff [t]
  (let [ch (chan 5)]
    (map (fn [i]
          (println i)) t)
    (go (>! ch 0))))

(ff [1 2 3 4 5])

映射函数体没有被执行。如果我删除最后一行中的 go 块,它会按预期工作。

这个函数给出了同样的问题:

(defn ff [t]
  (let [ch (chan 5)]
    (map (fn [i]
          (println i)) t)
    (>!! ch 0)))

map 懒惰运行。

当它不是 let 块中的最后一个形式时,不会计算结果,因此不会执行映射函数。

没有 go 方块也会发生这种情况。

如果您明确想要评估序列的副作用(如 println),请使用 doseq. If you need a lazy sequence to be evaluated eagerly (e.g. it depends on a network connection that will close), wrap it in doall