宏:有什么好处?

时间:2010-07-31 06:33:44

标签: macros language-design

保罗格雷厄姆writes

  

例如,类型似乎是一种类型   取之不尽的研究资源   论文,尽管是静态的事实   打字似乎排除了真正的宏 -   没有它,在我看来,没有   语言值得使用。

宏有什么大不了的?我没有花很多时间和他们在一起,但是从我使用过的旧版C / C ++来看,它们似乎主要用作模板/泛型存在之前的黑客。

很难想象

DECLARELIST(StrList, string);
StrList slist;

以某种方式优于

List<String> slist;

我错过了什么吗?

然后有用作伪函数,如MAKEPOINTS

POINTS MAKEPOINTS(
    DWORD dwValue
);

为什么不将它定义为函数呢?这是一些优化,您可以避免代码重复,而不会增加另一个堆栈帧的开销吗?

然后还有涉及GOTO的棘手的控制流程,这似乎是值得怀疑的。

宏有什么好处?它们的类型安全性较低(在C和C ++中)(对吧?)。保罗格雷厄姆为什么不在没有他们的情况下计划?

2 个答案:

答案 0 :(得分:6)

LISP宏是一个完全不同的野兽。 C / C ++宏只能使用极其基本的语言用一段文本替换一段文本。而LISP程序(在“阅读”之后)是一个LISP数据结构,因此可以使用整个语言进行操作。

使用这些宏,你可以(鉴于你是一个非常聪明的黑客)大大扩展了语言,每个人都可以相对容易地使用它,因为你用宏做了。以Common Lisp对象系统为例。从本质上讲,这种语言甚至没有像对象那样遥远。它完全用语言本身实现,包括使用相对简单的语法 - 使用宏。

当然,当语言包含你想要内置的大多数内容时,宏不太必要。 OTOH,LISP粉丝认为,具有足够强大的元编程功能(宏)的足够简单的语言(LISP)更好,因为可以将新概念合并到语言中而不改变规范或工作实现。但宏观用法最引人注目的例子是DSL领域。 Ruby on Rails和其他人每天都会展示DSL的有用性。是的,Ruby没有宏,它只是利用了多少Ruby语法。在其他语言中,甚至当Ruby的语法不够灵活时,您需要宏或完全成熟的解析器/解释器来实现复杂的DSL。

答案 1 :(得分:0)

宏实际上只适用于C / C ++中的两件事,并且通常应该是最后的工具(如果你可以在不使用宏的情况下完成某些事情,那么这样做)。

  1. 创建语言中不存在的新语法结构或抽象。
  2. 消除重复,特别是在必须彼此同步的事物之间。
  3. 几乎从不使用宏作为函数。

    您还必须意识到LISP宏不是 C / C ++宏。