由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