LISP宏的几点理解

来源:互联网 发布:网络歌手花姐 编辑:程序博客网 时间:2024/04/28 05:40

阅读了经典文章:http://www.defmacro.org/ramblings/lisp.html之后,这里有几个理解

1. LISP宏的作用

简短说就是将数据转换成代码。


2. 数据和代码的关系

首先LISP中所有的都是list, 当然也可以叫做S表达式,参考我的另一篇文章:S-expression

如果把list中的第一元素视为函数,该list就可视作代码一样运行。术语叫做求值, evaluate。当然也可以不求值,此时list就是数据。因此这里引出一个重要概念 ,代码也是数据,一切皆为数据,一切都是list.


3. 像C的宏一样传递参数

如果一个list传递给lisp函数,则先被求值为atom(一个特殊的list,不能再被求值)后再传递进去

如果一个list传递给lisp宏,则不被求值,而将其完整的传递进去,至于宏里面怎么干,随便宏的实现者怎么玩。像C的宏吧,不过C的宏只是文本替换,还是简单了点。


4. lisp宏返回的是什么

返回的是一个list,而且被视作可以求值的list,也就是代码。


5. 为什么说C的宏简单

C的预处理器所实现的宏只能进行简单的文本替换,至多加上换行符\ 或者连接符#

它不能帮我们生成for循环,也不能处理http下载,我们必须手动写C++代码,然后用文本替换的方式拼起来。如果做一个稍微复杂点的功能简直就是噩梦。而lisp宏除了3和4外,和一个正常的函数没有什么区别。

想象一下,如果C的宏能够像C的函数一样强大是多么方便,这就是lisp宏。


6. 用于元编程和DSL

元编程就是用代码创造新的代码,lisp宏的特性可以用来将传递进来的list和宏的实现代码合在一起,制作出新的代码,因此就支持了元编程。我不是很了解C++的template meta programming技术,但是凭直觉猜测lisp的解决方案更容易理解更强大,显然性能不及C++. 而元编程又可以用来创造DSL,特定领域语言。


这些都是概念,后面我会用newlisp来演示。




原创粉丝点击