评论由: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