5

我只是特别学习宏和clojure宏,我很好奇是否可以做这样的事情:

(defmacro with-a=hello [f]
  `(let [a "hello"] ~f))

(with-a=hello (println a))

这对我不起作用并引发错误:CompilerException java.lang.RuntimeException: Can't let qualified name: user/a, compiling:(NO_SOURCE_PATH:1)

正如我现在所理解的那样,scheme定义语法允许做这样的事情,但是有 clojure 方法吗?

4

1 回答 1

10

默认情况下,语法引用形式`防止在宏中引入未命名空间的符号和符号捕获。当您有意这样做时,您可以使用序列~'将非限定符号引入宏。

 (defmacro with-a=hello [f]
    `(let [~'a "hello"] ~f))

user> (with-a=hello (println a))
hello
nil

执行此操作的宏具有花哨的名称照应宏

于 2012-12-04T17:41:16.033 回答