Macros Clojure变量定义宏

Macros Clojure变量定义宏,macros,clojure,Macros,Clojure,我正在学习宏,尤其是clojure宏,我很好奇是否可以这样做: (defmacro with-a=hello [f] `(let [a "hello"] ~f)) (with-a=hello (println a)) 这对我不起作用,并引发错误:CompilerException java.lang.RuntimeException:不能让限定名:user/a,compile:(无源代码\u路径:1) 正如我现在所说,scheme的define语法允许这样做,但是有没有其他方法可以做到这

我正在学习宏,尤其是clojure宏,我很好奇是否可以这样做:

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

(with-a=hello (println a))
这对我不起作用,并引发错误:
CompilerException java.lang.RuntimeException:不能让限定名:user/a,compile:(无源代码\u路径:1)


正如我现在所说,scheme的define语法允许这样做,但是有没有其他方法可以做到这一点?

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

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

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

执行此操作的宏具有奇特的名称回指宏

请注意,
~'
不是任何特定的特殊序列,而是
~
(保留语法引号)和
'
(开始正常引号)的组合。