例如,类型似乎是一种类型 取之不尽的研究资源 论文,尽管是静态的事实 打字似乎排除了真正的宏 - 没有它,在我看来,没有 语言值得使用。
宏有什么大不了的?我没有花很多时间和他们在一起,但是从我使用过的旧版C / C ++来看,它们似乎主要用作模板/泛型存在之前的黑客。
很难想象
DECLARELIST(StrList, string);
StrList slist;
以某种方式优于
List<String> slist;
我错过了什么吗?
然后有用作伪函数,如MAKEPOINTS:
POINTS MAKEPOINTS(
DWORD dwValue
);
为什么不将它定义为函数呢?这是一些优化,您可以避免代码重复,而不会增加另一个堆栈帧的开销吗?
然后还有涉及GOTO的棘手的控制流程,这似乎是值得怀疑的。
宏有什么好处?它们的类型安全性较低(在C和C ++中)(对吧?)。保罗格雷厄姆为什么不在没有他们的情况下计划?
答案 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 ++中的两件事,并且通常应该是最后的工具(如果你可以在不使用宏的情况下完成某些事情,那么这样做)。
几乎从不使用宏作为函数。
您还必须意识到LISP宏不是 C / C ++宏。