我想,SICP是The Little Schemer(TLS)之后,一个不错的选择。TLS关注于Scheme最美的那个部分,而且在读者感到厌倦之前就结束了。相比之下,SICP要直到4.1章才讲Scheme解释器。我读TLS觉得有点味道了,并且能把TLS的程序调通,才决心去写写SICP上的code。如果让我一上来就读SICP,也许也会不知所云,不知道重点在哪里。
SICP对读者的要求很高。比如,第一章可以称为“如何用Scheme解数学题”。而且这些数学也不简单,数值分析,数论,微积分,矩阵,信号分析等等,虽然说都是这些学科的初步知识,但对于想学Scheme但没有背景知识的读者来说有相当大的难度。理工科大学生要花四年时间在这些数学问题上,而且等他们毕业以后,能够记住,理解和真正应用的内容,可能还没有SICP里提到的多。如果让我在大学时,做SICP的题目,估计大部分都做不了,也看不懂。
假设大多数读者从第一章开始读,线性地往下读,而且还要做些题目,平均阅读长度是多少,我很怀疑。我现在读到3.3章,几乎作了每道题(有170道了),开始觉得力不从心了。FP本身的难度要比C/C++语言编程难得多,尤其是那些higher function,虽然看起来漂亮的很,但要仔细想的话,简直是一些要人绞尽脑汁的技巧。你再去看看公司里的那些代码,要多dirty有多dirty,也没有人说不好,唉。
* * *
顺便谈谈对Lisp/Scheme的感觉。
我的第一感觉是,这一类语言必死无疑,它们和C语言这一类语言简直是两个极端。C语言是基于机器设计的,所以有大量诸如pointer,memory management的东西,可以说是dirty的很(也可以说hackable的很),把硬件底层的细节大多暴露给了用户。而Lisp是基于McCarthy的数学模型设计的,所以抽象的很,最怪的是把所有的函数都写成(f x y z ...)的形式,在这一点上倒是和汇编语言有点像。
在这个Object-Oriented横行的年代,Functional Programming除了在传说中的多核(或者hardware level multi-threading)上有一点优势,还有symbol program和晦涩的call/cc和越来越不好用的macro,还有什么?这仅有的一些优势也会被FP天生的编程困难所抵消。在我熟悉的硬件语言领域(Hardware language),也有语言竞争的现象,结论是像/C++/Java的语言胜出,他们不一定多好,只是工程师熟悉这种模式罢了。绝大多数工程师是随大流的,所有功成名就的老板都是随大流的。再举一个熟悉的例子,Matlab和C比较像,而Mathmatica和Lisp几乎同宗,最后也是Matlab占领了大多数的工程市场,这个市场可要比学术界大许多。
Scheme的用户应该都在大学里,而且可能只在Boston附近的那几个大学里,出了学校还有用户吗?谁会自讨没趣到用递归形式或者诸如map之类higher function的写循环?谁会用一个竟然没有name space的语言开发大型程序?谁会看一些满是学术用语,诸如lambda,continuation等晦涩关键词的程序?习惯了用满篇=赋值,能容忍没有这些好东西吗(Scheme有let,set!之类的东西,但远没有=好用)?Scheme的命运令人担忧,虽然有学术界的支持,但没有广大的群众基础。广大的开发人员需要的是“Dirty and Quick”的开发语言,有足够的,简单易懂的库,拿来就能用,他们才没有闲暇来欣赏什么“Beautiful Code”,“Elegent Language”,明天就是deadline,老板的脸色重要,还是代码漂亮重要,不言而喻。
* * *
在Lisp大家族里,最有影响力的,也许不是Common Lisp,也不是Scheme,而是Elisp(Emacs Lisp),从用户群就可以看出来。我认识的许多和计算机打交道的朋友都会用Emacs,它上手也比vi简单。我原来用vi,现在用Emacs的vi mode。看看Emacs的配置文件,不知不觉中,就会学到一些Lisp的语法,如果本来懂一些编程知识,那就更没有问题了。
事实表明,Emacs用户比VI用户更知道如何扩展editor,对它的原理也理解的更清楚(不包括redisplay之类的复杂算法)。在许多人的印象中,Emacs就像就像它的作者Richard Stallman(RMS,计算机名人堂中的重量级人物,许多hacker心目中的英雄)一样白发苍苍。我在用VIM的时候,也对Emacs不屑一顾。它甚至没有所有“现代流行”的editor都有的tab和dialog,GUI看起来像是70,80年代的老古董。但当我通过TLS和SICP熟悉Lisp这一类语言之后,我才开始阅读扩展Emacs,体会它的设计优点(当然,也许RMS在设计时并没有考虑这些)。举一个简单的例子,大多数的editor都会用one buffer one tab的模式,也就是每开一个文件,就对应一个buffer和tab。但当你开了超过20乃至30,40个文件之后,tab就开始失去它的作用了,也就是想要从tab来选择一个文件变得很困难。而Emacs有一些extension使得这种选择变得十分方便。
Emacs和SICP一样,对初学者来说相当困难,并引起初学者的反感。具有讽刺意味的是,这种困难来源作者的一片好意,作者试图将整个系统透明化,告诉用户每一个Key Binding对应那个function,每一个mode对应了那些function re-binding,以及每一个function的实现细节和文档。这对于有经验的工程师是一笔巨大的财富(Emacs包含了上千个function和超过百万行Elisp代码,以及每个function包含的docstring),但对于初学者和熟悉商用IDE环境的用户,却是头痛的。对于习惯于被束缚在一种开发环境下的用户,透明,自由,灵活,反而无法习惯了(虽然我现在在伟大的WinXP下写这篇文章,但我还是要说,这些也是Microsoft这位Big Brother给我们带来副产品)。正是这些特点,使得工程师可以在Emacs下开发org-mode,gud,email/news client,而用vim的script(vim scirpt与elisp相比,可以说是10岁和30岁的差距),几乎完全可以肯定无法实现这些extension。
世界上,采用Lisp和承认采用Lisp的公司不多。如Paul Graham所说,前者和后者不同。其一,大多数用户和股东只知道popular language,如果让他们知道公司竟然用不popular的language开发项目,一定会引起恐慌。其二,项目经理怕招不到Lisp programmer接班,他的恐惧是对的。其三,公司将Lisp作为秘密武器,放烟雾弹,让对手用popular language,自己悄悄用Lisp开发。
所以,也许读过SICP,写过Scheme程序之后,再也没有机会在项目中写Lisp程序。项目所用的语言是由许多因素共同决定的,主要因素是随大流。然而,无法用自己喜欢并且投入大量精力学习的语言写程序,是一件令人遗憾的事。所以也许,能够更好地理解和使用Emacs才是学习SICP和Lisp的(可能是唯一的,不包括Autodesk用户)最实际的目的。
* * *
让我们回到1989年,那时Lisp工作站渐渐被PC取代,各种以写Lisp系统为生的公司不得不写起了C++系统。Gabriel(McCarthy的弟子,在Parallel Lisp方面有贡献)在自己创办的公司里与员工们闲聊时,哀叹“Worse is better”(其实他是想说Simpler is better,或者dirty and quick is better)。这句戏言预言了之后二十年Lisp的宿命,一方面,各种新语言从Lisp吸取养分,另一方面,Lisp本身的用户数量却激剧缩小。人们逐渐把Lisp称为计算机语言里的拉丁语,连许多学校在开发项目时也放弃用Lisp。大家都有一个疑问,Lisp这么强大,为什么没人用?就好像问,“这个女孩这么美,为什么没男朋友”,或者“战争与和平这么好,为什么没人读”一样。这样的问题没法回答。英谚云,真相是时间的女儿(Truth is the daughter of time)。究竟“Better is worse”还是“Better is better”?还要时间来作出评价。
分享到:
相关推荐
在探索人生的多彩画卷时,我们不难发现,每个人的生命故事都像是时间的女儿,以不同的方式在社会的长河中孕育并讲述着自己的故事。《初中语文文摘社会时间的女儿》这篇文章,以其独特的视角和深刻的内涵,为我们展现...
这个方法不仅避免了直接交易羊本身,同时也满足了国王的要求,因为羊毛是可再生资源,可以在短时间内收集并出售,从而实现了看似不可能的任务。 这个故事极具教育意义,它传递了几个重要的信息。首先,它证明了数学...
例如,可以创建一个电子相册,通过时间线的方式展示女儿的成长历程,配以文字叙述和音乐,制作成一段多媒体生日礼物。或者,利用社交媒体平台发布这份贺词,让亲朋好友都能参与庆祝,增加互动性和社区感。 另外,...
文章提到了多个成功人士的例子,如蔡康永、刘宪华、郎朗、马云、黄磊女儿多多和周杰伦等,他们都有一个共同点,那就是在成长过程中遇到了坚持和努力的挑战,而他们的成功都离不开家长的“逼迫”和自律时间的培养。...
送女儿去县城读书,尽管生活条件艰苦,但父亲仍积极寻找赚钱的机会,体现了他对教育的重视和对女儿成长的关注。 4. **尊严与忍耐**:在医药市场拉板车时,父亲遭遇了别人的侮辱,但他选择了忍受而不是反抗,为了...
陈先生在伦敦女儿的空闲时间对应夏威夷时间为22~23时,在悉尼女儿的空闲时间对应夏威夷时间为20~21时,因此,陈先生与女儿们联系的最佳时间是夏威夷时间22~23时,选项A正确。 9. 经度与地方时:阴影部分表示m日...
例如,海伦夫妇想为女儿储备大学教育费用,假设年费用为$30,000,四年的学费总成本为$120,000,若目标是用现在的资金支付,假设年利率为5%,他们需要计算出现在需要存多少钱(现值)才能在18年后达到这个总额。...
伦敦与悉尼时差为10小时,陈先生在悉尼的女儿当地时间6-9时空闲,即北京时间16-19时,因此陈先生应在16时前与伦敦的女儿交流,16时后与悉尼的女儿交流。 以上是对高中地理试题中涉及的知识点的详细解析,涵盖了多个...
2.一个经理有三个女儿,三个女儿的年龄加起来等于 13,三个女儿的年龄乘起来等于经理自己的年龄,有一个下属已知道经理的年龄,但仍不能确定经理三个女儿的年龄,这时经理说只有一个女儿的头发是黑的,然后这个下属...
- 陈先生与女儿们交流的时间安排,需要考虑伦敦与悉尼的时区差异,以及两地的日出日落时间。伦敦位于零时区,悉尼位于东十区,两者相差10小时。 5. **等高线地形图的分析**: - 等高线地形图中急流段高差和甲、丙...
- 在《观沙砾记》这篇文章中,时间是“中午乘凉时”,地点是“河滩的柳荫下”,人物是“我与女儿”。主要内容是作者和女儿观察河滩沙砾的奇妙现象,以及由此引发的关于自然规律和个体特性的思考。 - 文章采用的是...
题目描述:有只羊,每天需要休息和活动的时间比为3:2,其中休息时间为10小时,那么这只羊每天的活动时间是多少? **答案解析**:题目给出的比例为3:2,代表休息时间和活动时间之比。已知休息时间为10小时,设活动...
在给定的问题中,爸爸、儿子、女儿通过三个信号量S、So、Sa实现了同步,确保了爸爸放水果、儿子吃桔子、女儿吃苹果的正确顺序。 磁盘调度算法在多道程序设计中也至关重要,先来先服务(FCFS)和最短寻道时间优先...
例如,对于女儿的论文,父亲的看法、女儿思考的开始时间;最近的ATM位置及如何前往便利商店;日期、房间预订类型及费用计算等。 4. **日期与时间处理**:第10题询问日期,这要求学生对日期的英语表达熟悉,能准确...
5. 限购政策:对于购房者的资格,如陈某和其女儿李某的情况,若女儿为本市户籍且已婚,名下已有1套住房,两人可以共同购买,但父亲陈某需提供无房证明,因为他不是本市户籍。 6. 经济适用房上市交易限制:经济适用...
1. 税负转嫁:在经济活动中,纳税人通过提高商品价格的方式,将应缴纳的税款转移给商品购买者或消费者的行为称为税负前转。这种现象表明税收负担可以从纳税人转移到消费者,是税负转嫁的一种形式。 2. 事业单位人事...
例如,当盘子为空时,父亲和母亲可以放水果,当盘子中有特定水果时,儿子和女儿可以取走水果。 4. **内存管理** - **页式虚拟内存**:逻辑地址和物理地址的转换涉及到页表和置换算法。在FIFO和Clock置换算法下,...
晚餐时间成为他们增进感情的时刻,有时女儿会协助他,有时他们会边烹饪边聊天,这些便当也因此在女儿的同学中赢得了好评。 【情感的传递与父爱的表达】 李宗盛相信,即使女儿长大后可能不再与他分享所有心事,但他...
操作系统进程调度是计算机科学中的一个核心概念,它关乎着系统如何高效、公平地分配处理器时间。在这个场景中,我们用“吃水果问题”来形象地解释这个概念。假设儿子、女儿和爸爸代表了系统中的三个并发执行的进程,...
3. **案例分析**:根据题目描述中的作业到达时间、运行时间等信息,我们可以计算出每个作业的开始时间、完成时间、周转时间和带权周转时间。 #### 五、银行家算法 **题目描述**:某个系统共有4种资源,给出在T0...