评论者为: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