Macros 在Clojure中将宏分解为宏或函数有什么区别吗?
如果我想在Clojure中分解宏,那么将函数或宏声明为子组件是否有任何区别(功能性或其他方面) i、 e.两者之间有什么区别吗Macros 在Clojure中将宏分解为宏或函数有什么区别吗?,macros,clojure,Macros,Clojure,如果我想在Clojure中分解宏,那么将函数或宏声明为子组件是否有任何区别(功能性或其他方面) i、 e.两者之间有什么区别吗 (defn sub-function [x] ...) (defmacro main-macro [x] (sub-function x)) vs 到目前为止,我的清单是: 我不能在我的子宏中重复,但我可以在我的子函数中重复 我无法重构我的主宏以将子宏用作高阶函数 我可以将我的子函数作为常规运行时函数调用 使用子函数意味着我不能直接将它们作为宏调用,但如果我想在
(defn sub-function [x] ...)
(defmacro main-macro [x]
(sub-function x))
vs
到目前为止,我的清单是:
所有这些都是相当琐碎的;使用子函数/子宏是否有任何约定或更有力的论据支持/反对使用子函数/子宏?除非您绝对不能,否则请始终执行第一个 “”的第一条规则(PDF)是“不要编写宏”。如果你必须写一个宏,或者想为某个动作提供一个好的语法,那么如果宏是该函数的唯一接口,那就非常恼人了。如果您不是创建子宏而是创建调用普通函数的宏,那么其他人可以使用函数或宏自由扩展代码。如果您使用进一步的宏来分解它们,那么您将创建“宏传染”,这将迫使所有扩展库的人只编写宏
我看到的最常见的情况是,我不能用函数分解宏,它分解成的东西已经是其他库中的宏了,这令人难以置信地沮丧。如果您能设法选择功能选项,您的同事和您未来的自我将感谢您 回答得好!宏应该始终是下一个选择,而不是第一个选择。如果可能,在选择宏时,请使用函数组合宏。道格·霍伊特的《让兰姆达过去》是一本关于宏的好书。在关注公共lisp的同时,对宏的原理、能力以及通常微妙的“gotchas”进行了很好的解释,我发现这本书为理解如何、何时以及何时不使用它们树立了良好的心态
(defmacro sub-macro [x] ...)
(defmacro main-macro [x]
(sub-macro x))