评论人:dnolen
考虑以下有关core.async和像core.match这样的库之间的交互是如何糟糕的
`
(defn foo [e]
(match [e]
[{:type :mouse :client-x x :client-y y}] [x y]
[{:type :mouse :page-x x :page-y y}] [x y]
[{:type :touch :page-x x :page-y y}] [x y]
[{:type :key :char-code c}] c))
`
如果没有core.async,core.match为您提供的这种典型的core.match用法生成合理的代码量 - 约有230行优化的打印出来的JavaScript。
但是,如果用户在这典型表达式周围用一个go块包裹它
`
(defn foo [in]
(go (while true
(let [[e c] (<! in)]
(match [e]
[{:type :mouse :client-x x :client-y y}] [x y]
[{:type :mouse :page-x x :page-y y}] [x y]
[{:type :touch :page-x x :page-y y}] [x y]
[{:type :key :char-code c}] c)))))
`
它会生成约4200行打印出来的JavaScript。我看不到core.async转换由core.match生成的优化条件语句的价值,它只是产生了18倍多的代码,并且额外生成的代码显然是没有用的 - 用户是在匹配一个值,他们无法在模式中放置任意计算。
https://gist.github.com/swannodette/7723758