clojure有标识符宏吗?

Ben*_*man 4 macros clojure

换句话说,有没有办法在看起来不像的表单上触发宏扩展(MACRO arg* ...).

举一个假设的例子:

(defmacro my-var
  (do (printf "Using my-var!\n") 42))
(+ my-var 1) ;; Should print & return 43
Run Code Online (Sandbox Code Playgroud)

我真正想做的是调用macroexpand带有自由变量的术语.我希望这些自由变量在宏扩展期间应具有特殊含义,但之后应该回到"正常".

Mic*_*zyk 8

该工具目前作为Clojure Contrib库tools.macro的功能之一存在于Clojure中.相关的tools.macro宏是defsymbolmacro,with-symbol-macros以及symbol-macrolet- 这里是symbol-macrolet自述文件的一个例子(现在在主分支的顶端找到):

(symbol-macrolet [def foo]
  (def def def))
Run Code Online (Sandbox Code Playgroud)

扩展到(def def foo)

symbol-macrolet用于引入词法范围的符号宏,同时defsymbolmacro引入符号宏以应用于任何with-symbol-macros块内(with-symbol-macros只有在Clojure编译器本身的支持下才能实现).

AFAIK,一些版本的symbol-macrolet计划功能已经包含在Clojure的编译器本身很长一段时间了; 预计当它落地时,它可能会被召唤letmacro.但是,没有具体的公共时间表,而且肯定不能保证完全降落.

tools.macro使用的名称受Common Lisp的启发,其中相关的宏被称为define-symbol-macrosymbol-macrolet.由于这是CL中的标准编译器功能,因此引入的符号宏define-symbol-macro实际上是全局应用的,无需任何帮助程序宏的帮助.