gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:43:43 28 4
gpt4 key购买 nike

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

即之间有什么区别吗

(defn sub-function [x] ...)

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

对比

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

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

到目前为止我的 list 是:

  1. 我不能在我的子宏中重复,但我可以在我的子函数中

  2. 我无法重构我的主宏以将子宏用作高阶函数

  3. 我可以将我的子函数作为常规运行时函数来调用

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

所有这些要点都是微不足道的;是否有任何约定或更有力的论点支持/反对使用子函数/子宏?

最佳答案

永远做第一个,除非你绝对做不到。

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

我看到的最常见的无法使用函数分解宏的情况是,当它分解成的东西本身已经是来自其他库的宏时,这非常令人沮丧。如果你能设法选择功能选项,你的同事和你 future 的自己会感谢你。

关于macros - 在 Clojure 中将宏分解为宏或函数之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28640667/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com