2009年7月19日星期日

初识Lisp

翻刘汝佳大牛的课件,无意中看到一本书SICP就买了本。Lisp这个世界上还在使用的第二老的语言,显然有她的独到的魅力。



Lisp的语法相当诡异,她使用前缀表达式,这一表达式在加强了其表述能力的同时,让许多人望而却步。Lisp已经有50年的历史了,但悲剧的是这门优雅强大的语言重来就没有成为主流语言过。国内连本Lisp的书都买不到。Lisp是大师的语言,高楼大厦都是大师所设计的;C是农民工语言,摩天大楼为其所建。只看完了sicp的第一节,就感觉了他的灵活性,以及强大的表达能力。



Lisp最近又有回升趋势,




让我们看看其他语言高手的评价吧!据资料显示,著名Java高手、Jolt大奖获奖作者Bruce Tate在2007年发表的《编程语言的王道:Lisp之美》中这样说到:



“Lisp
长久以来一直被视为伟大的编程语言之一。其漫长的发展过程(接近五十年)中引发的追随狂潮表明:这是一门非同凡响的语言。在 MIT,Lisp
在所有程序员的课程中占了举足轻重的地位。像 Paul Graham 那样的企业家们将 Lisp
卓越的生产力用作他们事业成功起步的推动力。但令其追随者懊恼万分的是,Lisp 从未成为主流编程语言。作为一名
Java程序员,如果您花一点时间研究 Lisp 这座被人遗忘的黄金之城,就会发现许多能够改进编码方式的技术。”


这位Java高手显然把Lisp当化石一样的研究。但事实上,我觉得Lisp更像是一个新诞生星云,在孕育未来的生命。Lisp让人更接近机器的思考,学习一门语言的同时就可以掌握解释器,编译器是如何工作的。SICP 也同时介绍了人类抽象事物的能力,将思维带到了另一个层次。下面我们看点实际的东西:



*Lisp支持内置的列表,这一点比java内置的vector成熟很多,python向他学的倒是比较像。

*自动内存管理,同样Lisp的表现比java,python更加优秀。

*支持动态类型

*支持匿名函数,这个别人都是向他学的,java匿名函数语法相当累赘。

*统一的语法,没有Lisp的程序员因为忘记语法而苦恼,Lisp帮你打破一切语法的糖衣。

   在其他语言中,a+b+c+d, 而Lisp使用(+ a b c d),几乎所有的格式都是(函数名  <参数列表>)。

*交互环境,Lisp的交互环境让很多人认为他是一个纯解释语言,但其实不然。

*可扩展性,Lisp是一个programmalbe programming language :)



既然Lisp有比java python跟强的表达能力,那么Lisp的效率如何呢?
















































































































Test Lisp JavaPythonPerl C++
exception handling0.010.901.541.731.00
hash access1.063.234.011.851.00
sum numbers from file 7.54 2.63 8.34 2.49 1.00

100+ x C++
reverse lines 1.61 1.221.38 1.25 1.00

50-100 x C++
matrix multiplication 3.30 8.90278.00 226.00 1.00

10-50 x C++
heapsort 1.67 7.0084.42 75.67 1.00

5-10 x C++
array access 1.75 6.83141.08 127.25 1.00

1-5 x C++
list processing 0.93 20.4720.33 11.27 1.00

0-1 x C++
object instantiation 1.32 2.3949.11 89.21 1.00
word count 0.73 4.612.57 1.64 1.00
25% to 75% 0.93 to 1.67 2.63 to 7.002.57 to 84.42 1.73 to 89.21 1.00 to 1.00

从上表我们可以看到,Lisp几乎是Java的1.5到4倍,Python的10到50倍(当然Python还在不断进化当中),而她跟C++差不多。



说了这么多,我还是写几本打你推荐的Lisp书比较好:



Paul Graham's On Lisp and ANSI
Common Lisp

SICP(scheme), MIT PRESS



Lisp的运行环境:

scheme用MIT Scheme(Linux下有点问题), PLT-Scheme用的蛮好

Lisp用 cmucl, sbcl, clisp都比较好,gcl传说还不是ANSI标准,我Fedora下运行还是段错误



没有评论:

发表评论