|
宏(Macro),港台称为巨集,是一種批次批量處理的稱謂。- F3 u1 M2 j3 ?( I! n7 F* a
- `1 C7 x5 C( |* Z5 \) v
计算机科学裡的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。' u% y% }% q7 J/ H3 [7 g
3 h& v- u/ v8 A8 h3 g: d4 [8 `# C* E: O宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽象能力——但这常常是一回事。
* U3 L, ?5 z( [. G' U
- j9 e" H: |" X计算机语言如 C 或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C 程序员可以获得更精巧的宏。
: z( }# C" V( P+ f) g: K, c3 |( r( ?) g5 _! |
Lisp类语言如Common Lisp和Scheme有更精巧的宏系统: 宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。一个 C 宏可以定义一段语法的替换,然而一个 Lisp 的宏却可以控制一节代码的计算。# I2 R0 F6 M$ m
% H" P8 T6 F' p5 }" K3 K获得了控制代码的执行顺序(见惰性计算和非限制函数)的能力,使得新创建的语法结构与语言内建的语法结构不可区分。例如,一种 Lisp 方言有 cond 而没有 if ,就可以使用宏由前者定义后者。Lisp 语法的去部主要扩展,比如面向对象的 CLOS 系统,可以由宏来定义。
' w8 P5 t9 Q6 ~/ F& k
& c' V% q J, w, R# j. l9 CMacroML有型别语法宏,一种有效的理解方式是把这种语法宏看作是多阶段计算。 |
|