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 规范中。这通常会导致库使用简化,消费命名空间不必担心显式区分某些变量是函数还是宏。例如

by
此更改发生在 https://clojure.atlassian.net/browse/ASYNC-119 中,在 2017.11.17 的 0.3.465 版本发布时
by
可能是用词不当。我应该说的是,当遵循文档时,扩展 '(go...)' 表达式不会扩展 'go' 宏,而是保留原样,这被解释为未定义的函数。

当 :refer 更改为 :refer-macros 时,'(go ...' 可以正常宏扩展
by
你是否看到了我的答案的其余部分?你使用的是哪个版本?我用最新的 cljs 和最新的 core.async 进行了复制,没有任何问题。
...