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

该更改发生在 https://clojure.atlassian.net/browse/ASYNC-119,在 2017.11.17 的 0.3.465 版本中
可能是个词的选择不当。我应该说的是,当遵循文档时,将 '(go...)' 形式进行宏展开并不展开 'go' 宏,而是保持原样,这被视为一个未定义的函数。

当 ':refer' 更改为 ':refer-macros','(go ...)' 就会被正确地宏展开
你看到我的答案的其他部分了吗?你使用的是哪个版本?我用最新的 cljs 和最新的 core.async 重新进行了测试,没有问题。
欢迎来到 Clojure Q&A,在这里您可以向 Clojure 社区的成员提问并获得回答。

分类

...