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 | Java | Python | Perl | C++ | ||
---|---|---|---|---|---|---|---|
exception handling | 0.01 | 0.90 | 1.54 | 1.73 | 1.00 | ||
hash access | 1.06 | 3.23 | 4.01 | 1.85 | 1.00 | ||
sum numbers from file | 7.54 | 2.63 | 8.34 | 2.49 | 1.00 | 100+ x C++ | |
reverse lines | 1.61 | 1.22 | 1.38 | 1.25 | 1.00 | 50-100 x C++ | |
matrix multiplication | 3.30 | 8.90 | 278.00 | 226.00 | 1.00 | 10-50 x C++ | |
heapsort | 1.67 | 7.00 | 84.42 | 75.67 | 1.00 | 5-10 x C++ | |
array access | 1.75 | 6.83 | 141.08 | 127.25 | 1.00 | 1-5 x C++ | |
list processing | 0.93 | 20.47 | 20.33 | 11.27 | 1.00 | 0-1 x C++ | |
object instantiation | 1.32 | 2.39 | 49.11 | 89.21 | 1.00 | ||
word count | 0.73 | 4.61 | 2.57 | 1.64 | 1.00 | ||
25% to 75% | 0.93 to 1.67 | 2.63 to 7.00 | 2.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下运行还是段错误。
没有评论:
发表评论