gpt4 book ai didi

clojure - 带有外部绑定(bind)符号的 core.async go block 有效但不宏扩展

转载 作者:行者123 更新时间:2023-12-02 16:19:35 25 4
gpt4 key购买 nike

在过去的几周里,我一直在使用 Clojure 和 Clojurescript 中的“core.async”,想知道在 go 中使用外部绑定(bind)符号是否是个好主意,因为有一个线程池,可能其中任何一个都可以使用绑定(bind)符号。它可以评估它,但宏扩展不起作用 - 请参阅以下代码片段

我想它应该可以正常工作。 x 是不可变的,不会被并发线程更改。使用 atom 作为可变数据的 x 也应该有效,因为它是 atom XD 例如对象引用当然不会工作或者可能会产生问题!

(let [x 5]
(clojure.core.async/go
(println x)))

;; => 5
;; nil
(clojure.walk/macroexpand-all
'(let [x 5]
(clojure.core.async/go
(println x))))

;; => Syntax error macroexpanding clojure.core.async/go at (your_project.cljc:93:3).
;; Could not resolve var: x

这似乎可行,但这是个坏主意吗?为什么?

谁能解释为什么宏展开不起作用?

最佳答案

macroexpand-all 不是高保真扩展器。它使用适用于简单宏的基本过程,但它并不能完成实际编译器所做的所有事情。值得注意的是,它不会管理绑定(bind)应该引入的 &env 映射。我假设 core.async 需要查看 &env 以确定绑定(bind)是本地绑定(bind)还是 var。

因此,您不应该期望 macroexpand-all 在这里工作,但是编写此类代码并没有错。

关于clojure - 带有外部绑定(bind)符号的 core.async go block 有效但不宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65812667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com