核心.带有外部绑定符号的异步go块可以工作,但不能宏展开



在过去的几个星期里,我一直在研究" core "。async"在Clojure和Clojurescript,想知道如果它是一个好主意,在go中使用外部绑定的符号,因为有一个线程池,可能任何这些可以使用绑定的符号。它可以对其求值,但是宏展开不起作用—参见下面的代码片段

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

(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不是高保真扩展器。它使用一个基本的过程来处理简单的宏,但它并没有完成实际编译器所做的所有工作。值得注意的是,它没有管理绑定应该引入的&env映射。我猜是核心。async需要查看&env来确定绑定是本地的还是var的。

所以,你不应该期望macroexpand-all在这里工作,但是写这种代码并没有错。

相关内容