Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 在Clojure中将宏分解为宏或函数有什么区别吗?_Macros_Clojure - Fatal编程技术网

Macros 在Clojure中将宏分解为宏或函数有什么区别吗?

Macros 在Clojure中将宏分解为宏或函数有什么区别吗?,macros,clojure,Macros,Clojure,如果我想在Clojure中分解宏,那么将函数或宏声明为子组件是否有任何区别(功能性或其他方面) i、 e.两者之间有什么区别吗 (defn sub-function [x] ...) (defmacro main-macro [x] (sub-function x)) vs 到目前为止,我的清单是: 我不能在我的子宏中重复,但我可以在我的子函数中重复 我无法重构我的主宏以将子宏用作高阶函数 我可以将我的子函数作为常规运行时函数调用 使用子函数意味着我不能直接将它们作为宏调用,但如果我想在

如果我想在Clojure中分解宏,那么将函数或宏声明为子组件是否有任何区别(功能性或其他方面)

i、 e.两者之间有什么区别吗

(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))