【问题标题】:Why doesn't this clojure code using go blocks work?为什么这个使用 go 块的 clojure 代码不起作用?
【发布时间】:2020-04-01 08:15:32
【问题描述】:
(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】:

    map 懒惰地运行。

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

    如果没有 go 块,就会发生这种情况。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2012-02-22
      • 2023-03-03
      • 2017-10-02
      • 2016-07-10
      • 2010-12-14
      • 2017-04-09
      相关资源
      最近更新 更多