其实在Lisp中,最让人称道的特性,是对数据和过程的表达形式的一致对待。在Lisp当中,(+ 11)可能是一段要执行的代码,也可能是一个要处理的数据,这完全取决于这个表达式位于什么位置。如果是在toplevel中,那么它就是一段代码,它将被执行并返回结果2。如果是在quote特殊表达式中,那么它就会被原样返回,当成数据处理。数据和过程的表示形式的一致,使得对函数进行处理的想法变得更加的自然,也催生了使Lisp这门古老的语言在瞬息万变的计算机世界中长久存活下来的特性,那就是这个地球上功能最强大的宏之一,Lisp的宏。
Lisp中的宏可以做非常多的事情,它可以用于创造新的语法,例如在CommonLisp当中没有和C中的switch语句功能一样的存在,那么我就自己定义一个叫做switch的宏,而且这个宏要怎么用,书写形式是怎么样的,完全由我编写者来掌控;宏还可以创造新的范式,据说CommonLisp的面向对象的特性CLOS,就是使用宏在原始Lisp的基础上创建的,而不需要修改编译器和解释器;宏可以最大程度地削减代码中的冗余,只要你知道该怎么写一个宏来帮你消除冗余就可以了,因为宏的特性,所以它可以起到模板的作用,可以生成书写代码的一段代码,因为宏是由编译器和解释器来展开并执行一次的。
宏的特性,在于它不会对它的表达式中的参数立即进行求值,以及需要被执行两次。common lispCommonLisp中的函数表达式,一定会在将参数传递给函数求值之前就把参数全部求值完毕,并且只求值一次。而且函数的返回值不会再由解释器或者编译器求值一次,直接返回给上一级调用者函数。宏则不然,所有参数在传递给宏中的形式参数时,都保持着原来的模样。因此,即使在宏的表达式中不加单引号``引用''表达式,也不必担心表达式可能运算失败返回稀奇古怪的值。宏的参数的求值,完全由宏的编写者决定,他/她可以决定求值哪些参数、求值多少次、哪个先求值哪个后求值等等,一切都具有可控性。而且宏还将在被展开之后送往toplevel再求值一次,因此就可以利用宏,来自动生成一些手写太麻烦,希望由程序代劳的代码,也就是消除冗余和用作模板的功能。总之,CommonLisp当中的宏强大无比,是最锋利的特性之一。
在使用Common Lisp方面,我还远远没有达到专家的地步,毕竟我连《OnLisp》中的不少代码都没有彻底弄懂,怎么想也都是个刚入门的家伙而已。但是我相信CommonLisp是强大的,就像冰河的在他的《超凡脱俗的极限——Common Lisp》一文中所说的那样,``CommonLisp是最强大的编程语言''。Common Lisp已经超越了C语言,成为了我最喜欢的语言,我也很希望能有更多的人领略到CommonLisp的独特风采。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-26737-2.html
亲
中国是一个爱好和平的国家