Cljs宏需要完全限定符号

3

在普通的repl上,这是有效的:

(defmacro evaluate
  [to-eval]
  (eval to-eval))
(evaluate +) ;=> #function[clojure.core/+]

然而,在ClojureScript中,当使用如下的分离文件时:

file one: macro.clj
(ns space.macro)
(defmacro evaluate
  [to-eval]
  (eval to-eval))

file two: core.cljs
(ns space.core
  (:require-macros [space.macro :refer [evaluate]))
(evaluate clojure.core/+) ;=> No error
(evaluate +) ;=> Unable to resolve symbol: + in this context

我们遇到了一些错误。这让我们想问为什么会出现这些错误?以及如何解决?


如果您选择一个没有eval的示例,这个问题将更具信息性。如果这是关于在ClojureScrips中使用宏来评估内容的问题,那也没问题。只要我们知道其中的区别,就可以更好地回答。 - Arthur Ulfeldt
这是关于“在ClojureScrips中使用宏来评估代码”的问题。 - Jason Basanese
1个回答

3
这是因为您需要在将符号 + 传递给宏之前对其进行评估,以便在将符号传递给其他命名空间之前解析该符号。您可以使用引用来实现这一点,如下所示:
(defmacro evaluate
  [to-eval]
  `(eval ~to-eval))

请查看《Clojure For the Brave and True》中的宏章节以获得更好的解释:http://www.braveclojure.com/writing-macros/#Simple_Quoting


使用时我得到了这个错误:WARNING: Use of undeclared Var cljs.core/eval at line # src/cljs/modern_cljs/core.cljs,因为cljs没有eval函数。 - Jason Basanese
我添加了一些粗体文本以强调您需要在宏处理完成之前对符号进行评估(即完全具有其代码)。Clojurescript没有与clojure(在JVM上)eval等效的内容。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接