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

问题描述 投票:0回答:1
(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)))
asynchronous clojure macros lisp s-expression
1个回答
2
投票

map懒惰地运行。

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

没有map块就会发生这种情况。

如果明确要评估副作用序列(例如go),请使用println。如果您需要急切地评估惰性序列(例如,它取决于将关闭的网络连接),请将其包装在doseq

© www.soinside.com 2019 - 2024. All rights reserved.