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

欢迎!请访问关于页面获取更多关于如何操作的信息。

0
core.async

https://script.clojure.org/guides/promise-interop

这是设置核心异步用于

(:require
   [cljs.core.async :refer [go]]
   [cljs.core.async.interop :refer-macros [<p!]])

我们正在使用当前的shadow-cljs和node目标,并发现这个方案将'go'暴露为函数而不是宏。

用:refer-macros [go]替换可以解决这个问题

1 个答案

0

你能解释你遇到的问题吗?暴露为函数是什么意思?

/t/async ❯❯❯ clj -A:cljs:async -m cljs.main -re node -r
ClojureScript 1.10.773
cljs.user=> (require '[clojure.core.async :as a :refer [go]])
nil
cljs.user=> (doc go)
-------------------------
cljs.core.async/go
([& body])
Macro
  Asynchronously executes the body, returning immediately to the
  calling thread. Additionally, any visible calls to <!, >! and alt!/alts!
  channel operations within the body will block (if necessary) by
  'parking' the calling thread rather than tying up an OS thread (or
  the only JS thread when in ClojureScript). Upon completion of the
  operation, the body will be resumed.

  Returns a channel which will receive the result of the body when
  completed

nil
cljs.user=>(let [x (go 3)] (go (prn (a/<! x))))
#object[cljs.core.async.impl.channels.ManyToManyChannel]
cljs.user=> 3

此外,这应该是没有问题的。

上面的相关部分
隐式宏加载:如果一个命名空间被要求或使用,并且该命名空间本身请求或使用其自身的宏,那么将使用相同的规范隐式地要求或使用这些宏。此外,在这种情况下,宏变量可以包含在:refer或:only规范中。这通常简化了库的使用,使得消费命名空间无需担心明确区分某些变量是函数还是宏。例如

此更改发生在https://clojure.atlassian.net/browse/ASYNC-119,在2017年11月17日发布的第0.3.465版中
可能是一个词的选择不当。我应该说的是,当遵循文档时,宏展开 '(go...)' 表达式并不展开 'go' 宏,而是保留原样,这被解释为未定义的函数。

当 ':refer' 更改为 ':refer-macros' 时,'$(go ...' 就会被正确地宏展开
你看到我的答案的其余部分了吗?你在哪个版本上?我用最新的 cljs 和最新的 core.async 进行了重现,没有任何问题。
...