clojure有标识符宏吗?

时间:2015-10-29 19:52:59

标签: clojure macros

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

举一个假设的例子:

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

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

2 个答案:

答案 0 :(得分:8)

此工具目前作为Clojure Contrib库tools.macro的功能之一存在于Clojure中。相关的tools.macro宏是defsymbolmacrowith-symbol-macrossymbol-macrolet - 来自README的sa symbol-macrolet示例(在主分支的右侧找到)现在):

(symbol-macrolet [def foo]
  (def def def))
  

扩展为(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引入的符号宏实际上是全局应用的,无需任何辅助宏的帮助。

答案 1 :(得分:2)

抱歉,不,Clojure没有此功能。

除了引用',语法引用`,调度#等读取器宏之外,它们扩展到函数参数位置之外,您无法添加在此扩展的宏位置。

读者文字略有相关,因为您可以定义在读取时将转换为数据结构的文字语法,但这些不能用作您所描述的变量。

语法报价阅读器宏的自动gensym功能虽然有限,却有一点点这种风格。