用户是否可以定义特殊的表单宏?

时间:2013-03-04 18:43:13

标签: clojure

看一些特殊形式的扩展方式:

(macroexpand '(String. "foo"))
(macroexpand '('a))
;; etc

...并意识到它们是作为宏实现的,这使我对用户定义的宏的语法形式限制感到好奇。到目前为止,我的所有宏都以其语法形式类似于函数。但是,例如,是否可以定义一个类似于以下的宏?:

(macroexpand '(myprintln-foo))
;;=> (println "foo")
(macroexpand '(myprintln-zoo))
;;=> (println "zoo")

2 个答案:

答案 0 :(得分:3)

限制是宏必须具有单个有效名称并返回单个表达式。它不能在调用命名空间之前将某些内容添加到表达式的末尾,也不能将两个表达式按顺序插入到调用命名空间中(不要通过将其包装在{{1}中而使其成为一个表达式)你可以写一个宏来定义很多宏:

do

宏只是返回s表达式的函数。只要它是一个有效的s表达式(函数arg arg ...),那个表达式就可以是任何东西。宏的名称必须与要调用的宏完全匹配,因此宏的名称不能是宏的一部分。您可以使用新的extensible reader功能接近您所询问的内容,尽管它不是您所需要的。

ps:值得指出的是,这个例子违反了宏观俱乐部的第一条规则并且是“不卫生的”

答案 1 :(得分:1)

如果我理解正确,你试图写一个reader macro而简短的回答是“不,这是不可能的”(或者至少不支持)。

查看this article及其评论