将宏分解为宏或Clojure中的函数之间有什么区别吗?

时间:2015-02-21 00:42:58

标签: macros clojure

如果我想在Clojure中分解宏,在声明函数或宏作为子组件时是否存在任何差异(功能或其他方面)?

即。

之间有什么区别吗?
(defn sub-function [x] ...)

(defmacro main-macro [x]
  (sub-function x))

VS

(defmacro sub-macro [x] ...)

(defmacro main-macro [x]
  (sub-macro x))

到目前为止我的清单是:

  1. 我不能在我的子宏中recur但我可以在我的子功能中

  2. 我不能重构我的主宏来使用子宏作为高阶函数

  3. 我可以将我的子功能称为常规运行时功能

  4. 使用子函数意味着我不能直接将它们称为宏,但如果我想在编译时使用它的功能,我总是可以将任何子函数包装在另一个宏中。

    所有这些都是微不足道的;使用子函数/子宏是否有任何约定或更强的参数?

1 个答案:

答案 0 :(得分:4)

总是做第一个,除非你绝对不能。

macro club”(PDF)的第一条规则是“不要写宏”。如果你必须编写一个宏或者想要为某个动作提供一个很好的语法,那么如果宏是该函数的唯一接口,则会非常烦人。如果不是创建子宏而是创建调用普通函数的宏,那么其他人可以使用函数或宏自由扩展代码。如果您使用其他宏来分解它们,那么您将创建“宏传染”,强制每个扩展您的库的人编写宏

我看到的最常见的情况是我无法用函数分解宏,当它分解成的东西已经是来自其他库的宏本身时,它令人难以置信地令人沮丧。如果您能够设法使用功能选项,您的同事和您的未来将会感谢您。