Clojure宏和符号绑定

Ell*_*mer 3 macros symbols clojure

不知道如何表达这个..

我写了一个带有两个参数的宏.第一个基本上包含用于生成let表达式的标识符.第二个是在let表达式中使用的代码(它希望能够访问这些标识符).

一个例子:

(match (Add {ast-> x}) (println x))
Run Code Online (Sandbox Code Playgroud)

当第二个参数是原始代码时,事情很好地工作.x绑定到let表达式中定义的x(当macroexpanded时,它只显示为x).但是,当第二个参数是生成(println x)的宏时,x会扩展为类似user/x的内容.

关于如何解决这个问题的任何好主意?

小智 6

听起来你的第二个宏被定义为:

(defmacro foo
  []
  `(println x))
Run Code Online (Sandbox Code Playgroud)

这是不正确的,因为x命名空间限定.在这种情况下,第二个宏的正确版本将是:

(defmacro foo
  []
  `(println ~'x))
Run Code Online (Sandbox Code Playgroud)

现在x,println调用中将是一个文字x符号,而不是命名空间限定.