Nic*_*ner 0 macros language-design
保罗格雷厄姆写道:
例如,类型似乎是取之不尽的研究论文来源,尽管静态类型似乎排除了真正的宏 - 否则,在我看来,没有语言值得使用.
宏有什么大不了的?我没有花很多时间与他们在一起,但是从我使用过的旧版C/C++开始,他们似乎在模板/泛型存在之前主要用作黑客.
这很难想象
DECLARELIST(StrList, string);
StrList slist;
Run Code Online (Sandbox Code Playgroud)
在某种程度上比较好
List<String> slist;
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
然后有作为伪函数的用法,如MAKEPOINTS:
POINTS MAKEPOINTS(
DWORD dwValue
);
Run Code Online (Sandbox Code Playgroud)
为什么不将它定义为函数呢?这是一些优化,您可以避免代码重复,而不会增加另一个堆栈帧的开销吗?
然后还有涉及GOTO的棘手的控制流程,这似乎是值得怀疑的.
宏的优点是什么?它们的类型安全性较低(在C和C++中)(对吧?).没有他们,保罗格雷厄姆为什么不计划?
小智 6
LISP宏是一个完全不同的野兽.C/C++宏只能使用极其基本的语言用一段文本替换一段文本.而LISP程序(在"读取"之后)是LISP数据结构,因此可以使用整个语言进行操作.
有了这样的宏,你可以(鉴于你是一个非常聪明的黑客)大大扩展了语言,每个人都可以相对容易地使用它,因为你用宏做了.以Common Lisp对象系统为例.从本质上讲,这种语言甚至没有像对象那样遥远.它完全用语言本身实现,包括使用相对简单的语法 - 使用宏.
当然,当语言包含你想要内置的大部分内容时,宏不太必要.OTOH,LISP粉丝认为,具有足够强大的元编程功能(宏)的足够简单的语言(LISP)更好,因为可以将新概念合并到语言中而不改变规范或工作实现.但宏观用法最引人注目的例子是DSL领域.Ruby on Rails和其他人每天都会展示DSL的有用性.是的,Ruby没有宏,它只是利用了多少Ruby语法.在其他语言中,或者甚至当Ruby的语法不够灵活时,您需要宏或完全成熟的解析器/解释器来实现复杂的DSL.