lisp真是一门终极的编程语言。我接触lisp也不过一个月时间?现在发自肺腑的这么觉得。为什么?因为lisp又高级又基础,lisp没有python或者ruby里那些便利的数组或者hash操作函数,很多时候,lisp的数据只由2个部分组成:
(AAA . BBB)
第一个元素AAA称为car部分,剩下的另外一半。不管有多少,称为cdr部分。也就是对称的第二个元素。这叫con cell元素。很多复杂的数据结构,比如数组,hash表,红黑树,二叉树都是由它实现的。你说它不基础?但是lisp又很高级,c语言的一个特性是,机器效率虽高,但是人工效率很低。而lisp不同,《黑客与画家》中指出,lisp只需要c语言十分之一的代码就能实现同等的功能。而lisp甚至能直接操作cpu的寄存器,这是哪种高级虚拟机语言能实现的?
lisp很简洁,用一句话就能概括lisp的语法:
例如(A B C)
用圆括号括起来称为一个列表,列表中第一个原子被视为函数,其他原子被视为变量。而由单括号‘前导的元素什么也不视为(不求值),只按原样返回。
完了,就这么简单。剩下的都是细节。要知道真理都是很简洁的,比如e=mc2,真理总结出来都这么简单。所以lisp很强。
用多数人可以理解的话说,lisp没有”保留字“。我们知道每种语言包括c但是有保留字的。这意味着2点:
1.他们的处理语句和数据是分开的,不一样的。
2.他们都是被限制了的
但是lisp没有保留字,为什么呢?你看多数语言像c++,Java根本就没有所谓符号(symbol),ruby有符号,但是应用很少。lisp不同,lisp大多数原子都是符号。比如(print atom-1 atom-2),每一个符号可以连接着一个函数定义,或者一个变量定义,这个例子就是对atom-1,atom-2 两个符号进行求值,找出他们的变量定义然后交给print这个函数去运算。你可以把它调过来。(atom-1 print atom-2) ,这个例子就是对print,atom-2 两个符号进行求值,找出他们的变量定义然后交给atom-1连接的函数去运算,区别可能是print可能是一个系统预先定义好的函数,而atom-1可能是用户自定义函数。所以说lisp是没有保留字,也不需要保留字的。
所以我们就可以看到了,lisp一个有名的特点,数据和语句是一样的,是怎么实现的了。非常简单,同样的东西,你把它放在列表第一个,就是函数,否则就是变量,如果加上单引号不求值,那就是数据。如此,lisp也可以实现非常强大的宏系统,这也是独一无二的,其他语言都不能,因为他们都不可以把数据和语句区别开来。简单的说,宏就是接受一个参数,然后返回对应的代码,插入到调用宏的位置
( defmacros (args)
`(defun aaaaa(,args)
;; process ))
这样的东西
把对应的代码恢复到对应位置,只要求值,就和普通的代码无异。所以lisp可以。而其他语言不可以。你返回一段语句,这段货的数据类型是啥?它就是数据,不是语句。要运行它,eval它,然后只能得到一个结果(以我对ruby粗浅的了解,它已经比java灵活太多了)。不像lisp可以替代源代码中的一个部分,比如替代函数中的一部分,这段代码可以操作参数,其他语言可以么?
但是lisp这么强大,为什么1958年就被发明,半个世纪以来,lisp没有广泛的应用?
lisp并非没有得到过应用。在教学领域,lisp是一门非常广泛使用的语言,那些不急功近利的学校比如麻省理工,入门课都采用schme(一门lisp的方言),而在商业领域,有名的《黑客与画家》的作者P··G在创立世界第一家互联网企业viaweb时,使用的是lisp。lisp之所以没有被广泛应用,是因为它太强大了,这么说似乎有点欠揍,但强大就意味着灵活,而灵活就意味着几乎没有语法。那些商业公司想要的只是稳定,把工作完成,他们并不在乎你用什么语言开发。他们才恨不得每一行都是钉死的,所有人都用一个名字写函数,因为这样可以花更少的钱维护。ruby之父松本行宏曾这么说:
而lisp的问题在于,只要你掌握了s表达式,想写出什么样的程序都行,这意味lisp是没有语法的。这在应用上带来了一定的麻烦。我不希望自己的语言是没有语法的。所以ruby加入了一定的语法限制。
而在程序员的角度来说,以我看来,大多数人似乎不那么聪明,多数人喜欢用一种死语言(java/c++)也无可厚非,因为他们的思维可能就是死的。lisp可能更适用于强大的黑客,自己或者少数人每个人都很强的类型,它是一种黑客语言,而不是一种商业语言。
综上所述,lisp是灵活的,天马行空的,没有限制的。在我看来,一旦使用lisp,就不会想在去使用其他语言。lisp有一种和谐的美。我认为,Fortran,c++,java这样的东西是应需而生的,他们是为了满足当下的需要和硬件条件而设计使用的。而lisp从开始就是为了迎合真理和美而生。所以50年过去了,lisp还没有过时。lisp就是计算机界的真理,记得漫画《风云》中有这么一句,因为不管到哪里,真理(或者是类似的词)就是真理,所以绝世好剑的形状在哪都是一样的。lisp也是一样。以后可能会出现别的名字的语言,也可能不叫lisp,但是真理总是真理,所以绝世好剑的形状总是一样的。
但是从现实的角度来看,我们要编程,如何运用lisp呢?
- emacs使用emacs lisp作为架构语言(不仅仅是扩展语言),这是绝佳的学习lisp的途径
- common lisp和scheme作为lisp最有名的两门方言,广为人知。但是在教育领域应用比较多。实际用途似乎比较少
- GNU组织使用guile作为gnu通用扩展语言,但是我没听说哪有它的应用。
- 时下最火的clojure,你可能听说过,这是一种运行在java虚拟机上的lisp,编译为java字节码,具有和java一样的速度,使用它可以无缝使用jdk里的所有库和java的无数第三方库,现在你知道它为啥火了。clojure的一个子集可以编译为javaascript运行在浏览器中,这带来了无尽的可能,尽情的享受那些愚民们的成果吧,node.js貌似也行。