一、为何想学lisp
最初了解lisp是从《黑客与画家》里,里边的黑客强烈推荐程序员用lisp,并有部分讲《为什么lisp语言如此先进?》,书是阮一峰翻译的,这节在他的博客也有节选:
http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html
总结一下:
a. 越近代的语言越像lisp;而当前最新潮的语言也只是实现了lisp作者在1958年的设想,因为lisp设计目的是数学理论演算而不是语言这种本质上的一种技术。技术会过时而数学不。今天最高级的主流语言,也只是刚刚接近lisp的水平。虽然已经接近,但还是没有lisp那么强大。
b. 等等,其他不一一摘抄。
其中一点提到,“一行lisp代码相当于20行C代码”。lisp会缩短开发周期,而且还是c能做lisp所有事情的前提下。文中举例说,如果你用其他语言跟别人lisp语言的公司竞争,同样的功能你就比别人慢很久才能开发完,竞争就出于劣势。
其他在网络上看到的lisp相关言论:
起名为“格林斯潘第十定律”(Greenspun's Tenth Rule):“任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。”
二、学习过程中
另外还有个原因,最近想了解函数式编程,想了解下支持分布式原语的erlang,先学哪个还是纠结了下的。 后来考虑到新到的项目中想设计成分布式扩展方便的服务器架构,就优先学下erlang。先花几天把《Erlang程序设计》给看完了,看的很激动,但是考虑到项目人员现状及将来的维护,项目没用erlang,用了node.js。
之后又花几天把许式伟他们写的《Go语言编程》看完了。go语言确实不错,以后可以考虑用这个写个游戏服务器引擎什么的。本想立即就开动,但是项目属于开始搭架子阶段,需要思考的时间挺多,回家可以利用的时间不多,专心写开源项目不现实。
于是回家的时间先学Common Lisp(以下简称cl),现在正在看田春翻译的《实用Common Lisp编程》,看到12.6映射。
cl很多东西跟类c的语言差别就比较大了,看的进度还是挺慢的。看着看着,一边惊叹他强大的表现力,一边有点害怕太庞大,以后实用起来不顺利。
如果找份cl的工作,国内大小公司估计都不大好找。除非能在一个高手云集的团队里,大家又都喜欢cl,而且我们有话语权……
所以将来cl在为了更好的思考编程之外,很可能只是用来写些脚本或者自己的玩具什么的。近期的应用可能是生成javascript代码。
等cl学的不错了,可以做些个人项目的快速开发……
三、我了解Common Lisp一些资料
建议一下书籍,按阅读顺序(在知乎看到的,别的地方推荐也大同小异):
《Structure and Interpretation of Computer Programs》(SICP)可以启发思想,尤其是函数式编程入门;
《Practical Common Lisp》和《Land of Lisp》也适合初学者;
《On Lisp》主要讨论macro的使用;
《Let over Lambda》在《On Lisp》基础上更深入讨论宏。
《On Lisp》和《Practical Common Lisp》(中译为《实用Common Lisp编程》) 由田春翻译完成。我个人先买了SICP,但是里边是讲Scheme,看了几节怕到时学lisp会混乱,就转先实用lisp这本了。
另外我用的实现是Steel Bank Common Lisp。
四、附上这段时间了解的函数式语言个人简介
这条自己的理解,纯粹为了自己做个笔记。
haskell貌似比较新,应用不多,别说是分布式,就是普通应用也不多。haskell是纯函数式。而lisp不是纯的,还可以以别的方式来编程。
erlang倒是主打分布式。erlang内置了多台机器之间的通讯原语,程序员只用关心业务逻辑就可以了。
lisp主要是一种全新的看待软件开发的视角。
go也支持闭包。