我看到许多 Clojure 程序员对新的 core.async 库充满热情,虽然它看起来很有趣,但我很难看出它是如何符合 Clojure 原则的,所以我有以下问题:
- 它在任何地方都使用可变状态,正如函数名称通过感叹号所暗示的那样,如 alt!、put!、>! 等。如果您从通道中放置或获取值,则该通道将被就地修改。这不是与 Clojure 偏好不可变数据结构、纯函数等的哲学相悖吗?还是 core.async 仅用于根本无法避免可变事物的情况?
由于“go”是一个宏(因此修改代码结构)并确保“<!” 直接在 go-block 中使用,不能使用 "<!" 在另一个函数中,像这样:
(defn take-and-print [c] (println (<! c))) (def ch (chan 1)) (>!! ch 123) (go (take-and-print ch)) Assert failed: <! used not in (go ...) block
在我看来,这妨碍了简单性和可组合性。为什么这不是问题?
也许是前两个问题的结果,很多带有 core.async 的代码都使用了低级结构,例如循环/递归,而不是 map/filter/reduce。这不是倒退一步吗?
我在哪里错过了重点?
提前致谢。