在 Clojure REPL 中:
(macroexpand-1 `(sum 2 1)) ; (user/sum 2 1)
在 Clojurescript REPL 中:
(macroexpand-1 `(sum 2 1)) ; AssertionError: Assert failed: Argument to macroexpand-1 must be quoted
为什么会发生这种情况?您能解释一下 Clojurescript 中的评估过程吗?
在 Clojure 中,
macroexpand-1
可以是一个函数,因为 Clojure 可以在运行时访问编译器,因此 macroexpand-1
可以检查您构造的任何列表。 Clojurescript 被编译为 Javascript,并且在运行时无法访问编译器。所以 Macroexpand 仅在编译时有用,并且必须是宏才能运行。因此,它不会评估其参数,并且需要它是一个字面引用列表。