我已经看到许多Clojure程序员对新的core.async库充满热情,虽然看起来很有趣,但我很难看出它是如何符合Clojure原则的,所以我有这样的问题: 它在任何地方都使用可变状态,因为函数名称带有感叹号,比如alt !, put !,> !,等等。 如果你从某个频道input或取得一个值,则该频道将被修改。 Clojure更喜欢不可变的数据结构,纯函数等等,这不是违背了吗? 还是core.async只能用在可变的东西根本无法避免的地方? 由于“go”是一个macros(因此修改代码结构)并确保“<!” 直接用在一个转换块中,不可能使用“<!” 在另一个函数里面,像这样: (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的许多代码使用较低级别的构造,如loop / recur,而不是map / filter / reduce。 这不是一个倒退吗? 我错在哪里? 提前致谢。