我只是特别学习宏和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 允许做这样的事情,但是有没有这种方式呢?
答案 0 :(得分:8)
默认情况下,语法引用形式`会阻止在宏中引入非命名空间符号和符号捕获。当您有意执行此操作时,您可以使用序列~'
将非限定符号引入宏。
(defmacro with-a=hello [f]
`(let [~'a "hello"] ~f))
user> (with-a=hello (println a))
hello
nil
执行此操作的宏具有花哨的名称照应宏