如果我想在Clojure中分解宏,在声明函数或宏作为子组件时是否存在任何差异(功能或其他方面)?
即。
之间有什么区别吗?(defn sub-function [x] ...)
(defmacro main-macro [x]
(sub-function x))
VS
(defmacro sub-macro [x] ...)
(defmacro main-macro [x]
(sub-macro x))
到目前为止我的清单是:
我不能在我的子宏中recur
但我可以在我的子功能中
我不能重构我的主宏来使用子宏作为高阶函数
我可以将我的子功能称为常规运行时功能
使用子函数意味着我不能直接将它们称为宏,但如果我想在编译时使用它的功能,我总是可以将任何子函数包装在另一个宏中。
所有这些都是微不足道的;使用子函数/子宏是否有任何约定或更强的参数?
答案 0 :(得分:4)
总是做第一个,除非你绝对不能。
“macro club”(PDF)的第一条规则是“不要写宏”。如果你必须编写一个宏或者想要为某个动作提供一个很好的语法,那么如果宏是该函数的唯一接口,则会非常烦人。如果不是创建子宏而是创建调用普通函数的宏,那么其他人可以使用函数或宏自由扩展代码。如果您使用其他宏来分解它们,那么您将创建“宏传染”,强制每个扩展您的库的人仅编写宏。
我看到的最常见的情况是我无法用函数分解宏,当它分解成的东西已经是来自其他库的宏本身时,它令人难以置信地令人沮丧。如果您能够设法使用功能选项,您的同事和您的未来将会感谢您。