2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请查阅关于页面以获取更多关于如何使用的详细信息。

0
core.async

core.match 条款与 core.async 转换之间的交互是不理想的。core.async 应当尊重某些钩子,以便某些表单保持不变。例如

(match [x y] [1 2] ... [3 4] ...)

{{[1 2]}} 和 {{[3 4]}} 对应生成为其附加的元数据。

4 个答案

0

评论者:richhickey

你能更具体一点吗?这听起来像是一个坏主意,我很想知道为什么有这样的需求。

0

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

0

评论由: metametadata 发表

我仍然遇到这个问题,不得不使用来自 https://github.com/emezeske/lein-cljsbuild/issues/303 的 {{:jvm-opts}} 工作区。在我的情况下,StackOverflow 似乎也和 {{is}} 与 {{core.async}} 和 {{try-catch}} 的组合有关。

0
参考:[https://clojure.atlassian.net/browse/ASYNC-40](https://clojure.atlassian.net/browse/ASYNC-40)(由 dnolen 报告)
...