开始学习 Common Lisp
为何想学 Lisp
最初了解 Lisp 是从《黑客与画家》里,里边的黑客强烈推荐程序员用 Lisp,并有部分讲《为什么 Lisp 语言如此先进?》,书是阮一峰翻译的,这节在他的博客也有节选: http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html
总结一下:
- 越近代的语言越像 Lisp;而当前最新潮的语言也只是实现了 Lisp 作者在 1958 年的设想,因为 Lisp 设计目的是数学理论演算而不是语言这种本质上的一种技术。技术会过时而数学不。今天最高级的主流语言,也只是刚刚接近 Lisp 的水平。虽然已经接近,但还是没有 Lisp 那么强大。
- 等等,其他不一一摘抄。
- 其中一点提到,“一行 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也支持闭包。