Common Lisp中的宏
Lisp与其他语言之区别 函数式编程,前缀表达式,繁多的括号,奇怪的操作符等等,这些都足以让Lisp和其他编程语言看起来有很大的区别,但是这些区别并非本质上的差异。让Lisp和其他编程语言有本质区别的是它对宏的支持。 C语言中的,被称为宏的预编译系统自有其好处,但是和Lisp中的宏比起来,好比的Notepad和Vim或者Emacs之间的差异。 数据与代码 在Lisp中,数据和代码间的差异非常小,上一篇文章简单讨论了引用的基本概念,其中对数据与代码的差异已经有所涉及。 宏(Macro) 简而言之,宏即替换,在Lisp中,可以通过程序生成代码(s-expr),而这些代码又可以被执行(当然,需要是合法的s-expr)。这一点赋予了宏无限的可能性,比如定义一个新的语法: (defmacro only (condition &rest body) `(if ,condition (progn ,@body))) Lisp中函数macroexpand-1可以用来查看调用时宏是如何展开的: > (macroexpand-1 '(only (> x 10) (format t "big than 10"))) (IF (> X 10) (PROGN (FORMAT T "big than 10"))) 上例中,(> x 10)被作为condition,而(format t "big than 10")作为body传递给了宏。 > (macroexpand-1 '(only (> x 10) (format t "big than 10") (format t "~%"))) (IF (> X 10) (PROGN (FORMAT T "big than 10") (FORMAT T "~%"))) 使用progn是为了让剩余的多条语句(如果有的话),逐条执行,并返回最后一条语句的值(正如在函数中那样)。...