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

欢迎!请查看关于页面以了解更多有关如何操作的信息。

0
core.async

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

这被认为是设置 core.async 的方式。

(: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 规范中。这通常导致简化库的使用,使得消耗命名空间无需担心明确区分某些变量是函数还是宏。例如

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

当 :refer 更改为 :refer-macros 时,'(do ...' 可以正确地展开
您看到我的答案的其他部分了吗?您使用的是哪个版本?我用最新的 cljs 和最新的 core.async 进行了复现,没有任何问题。
...