Clojure var-defined宏

Dfr*_*Dfr 5 macros clojure

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

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

(with-a=hello (println a))
Run Code Online (Sandbox Code Playgroud)

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

正如我现在所说的那样,schemedefine-syntax允许做类似的事情,但是有没有这样的方法呢?

Art*_*ldt 8

默认情况下,语法报价表单会`阻止在宏中引入非命名空间符号和符号捕获.当您有意这样做时,您可以使用序列~'将非限定符号引入宏.

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

user> (with-a=hello (println a))
hello
nil
Run Code Online (Sandbox Code Playgroud)

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

  • 有用的是要注意`〜'`不是任何特殊的特殊序列,而只是`~`(保留语法 - 引用)和`'`(开始正常引用)的组合. (4认同)