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