Clojure var-defined宏

时间:2012-12-04 17:36:17

标签: macros clojure

我只是特别学习宏和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 define-syntax 允许做这样的事情,但是有没有这种方式呢?

1 个答案:

答案 0 :(得分:8)

默认情况下,语法引用形式`会阻止在宏中引入非命名空间符号和符号捕获。当您有意执行此操作时,您可以使用序列~'将非限定符号引入宏。

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

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

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