宏是怎么扩展的呢?
比较流行的编程语言中,Java
,Python
都没有定义宏的功能。c
语言中的宏限制比较大,
没有Lisp
中的宏强大。以下提到的宏,指的是Lisp方言中的宏。
宏的求值可以分为两个步骤
- 扩展(expand)–编译期
- 求值(eval) –运行期
这看起来很简单,但是实际写macro的时候,就会有很多的困惑。这里的主要矛盾就是理解 以下两个过程,
- 在一个宏的内部调用另一个函数
- 在一个宏的内部调用另一个宏
不同的lisp方言有不同的实现。以下用Clojure来研究宏的用法。