小编aeu*_*uea的帖子

是不是与Clojure原则相反的core.async?

我见过很多Clojure程序员热衷于新的core.async库,虽然看起来非常有趣,但我很难看到它是如何符合Clojure原则的,所以我有这些问题:

  1. 它在任何地方都使用可变状态,因为函数名称通过带有感叹号来表示,例如alt!,put!,>!和其他.如果您从频道中输入或获取值,则会在该位置修改该频道.是否与Clojure哲学相反,它更倾向于使用不可变数据结构,纯函数等等?或者是core.async仅在无法避免可变事物的情况下使用?
  2. 因为"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
    
    Run Code Online (Sandbox Code Playgroud)

    在我看来,这可以防止简单性和可组合性.为什么不是问题?

  3. 也许作为前两个问题的结果,core.async的许多代码使用较低级别的构造,例如loop/recur而不是map/filter/reduce.这不是倒退吗?

我在哪里错过了这一点?

提前致谢.

clojure core.async

42
推荐指数
4
解决办法
5798
查看次数

标签 统计

clojure ×1

core.async ×1