
参考文章: 《Pratical Common Lisp》
7. Macros: Standard Control Constructs
http://www.gigamonkeys.com/book/macros-standard-control-constructs.html
Macros 是Lisp特有的一种扩展机制,Macro 这个词本身在其他的语言以及软件中也有出现,但含义有所差别。实际上,Lisp的很多特性,比如动态特性、垃圾收集都已经被集成到其他的语言中,但 Macro还没有。
Macro 就是通过程序生成程序的法宝,或曰产生式编程。
语言一般通过标准库来实现扩展性,Macro是Common Lisp的另一种扩展方式。Macro可以定义自己的语法结构,这样可以自己扩展语言本身,使其更适合于问题域。
Lisp 语言本身一些语法结构就是通过Macro 来实现的,比如 When unless
(defmacro when (condition &rest body) `(if ,condition (progn ,@body)))
(defmacro unless (condition &rest body) `(if (not ,condition) (progn ,@body)))
|
Macro Expansion Time 与 Running Time 在Macro Expansion时,无法访问任何数据,因为那些是在running time才存在的。
Defmacro
(defmacro name (parameter*) "Optional documentation string." body-form*) |
写一个macro的过程是,首先写出他的调用形式,以及展开形式,然后翻译成 defmacro程序。简单的macro只需要直接的替换就可以,复杂的需要自己的程序逻辑及数据结构。最后需要注意不要遗漏其他的参数情况。避免leak。