换句话说,有没有办法在不像(MACRO arg* ...)
的表单上触发宏扩展。
举一个假设的例子:
(defmacro my-var
(do (printf "Using my-var!\n") 42))
(+ my-var 1) ;; Should print & return 43
我真正想做的是在带有自由变量的术语上调用macroexpand
。我希望这些自由变量在宏扩展期间应具有特殊含义,但之后应该回到“正常”。
答案 0 :(得分:8)
此工具目前作为Clojure Contrib库tools.macro的功能之一存在于Clojure中。相关的tools.macro宏是defsymbolmacro
,with-symbol-macros
和symbol-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-macro
和symbol-macrolet
。由于这是CL中的标准编译器功能,因此define-symbol-macro
引入的符号宏实际上是全局应用的,无需任何辅助宏的帮助。
答案 1 :(得分:2)
抱歉,不,Clojure没有此功能。
除了引用'
,语法引用`,调度#
等读取器宏之外,它们扩展到函数参数位置之外,您无法添加在此扩展的宏位置。
读者文字略有相关,因为您可以定义在读取时将转换为数据结构的文字语法,但这些不能用作您所描述的变量。
语法报价阅读器宏的自动gensym功能虽然有限,却有一点点这种风格。