Clojure变量定义宏

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)

据我了解,目前可以使用 schemedefine-syntax 来实现类似的功能,但是 Clojure 有没有相应的方法呢?

1个回答

10

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

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

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

做到这一点的宏有一个花哨的名字,叫做指代宏。


4
需要注意的是,~'并不是特定的特殊序列,而只是由~(保留语法引用)和'(开始普通引用)组合而成。 - amalloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接