大概不少programmer都看過《黑客與畫家》,作者用了整整一章的篇幅討論Lisp的強大。我自然就會手癢癢。
幾個月前,幾天內攻城略地搞定了Python,用的方法便是用Py重寫之前開發的類庫,這樣就能很快熟悉語法,培養語感。喜上眉梢的我,也嘗試將同樣的策略用在Lisp上,我開始查看它的語法和函數,比如如何定義類和函數,如何賦值等等。
但我慢慢發現,Lisp幾乎都不需要學語法,就是括號和幾個基本過程,無非就是lambda, define, let,cons,car,cdr等等。雖然語法很快就學完了,但卻很難用它寫出以前Python或C#風格的命令式代碼。連賦值都變得如此詭異,而且有數不清的方言,定義類時,每種方言都不一樣!函數名都超長,變量甚至會用問號感嘆號等平時根本不敢想的符號。
在嘗試寫Lisp一天之后,我無奈的放棄了,它的思路和我之前所有的觀念都很不相同!
后來我看了《計算機程序的構造與解釋》(SICP).
這本書名氣顯然沒有《編程珠璣》甚至《編程之美》名氣大。但它的目錄很對我的胃口,流模式,惰性求值,元語言抽象,聽着是不是就很有逼格呢?於是我迫不及待的踏上這片土地,一邊看一邊做習題。
之后發生的事情超出了我的想象,這僅僅是一本MIT的大一新生的入門課程,其思維深度,習題難度和廣度都超過了我的想象。怪不得國外有那么多大神,因為人家看過了這樣牛逼的教材!它的函數求導和積分的方法,高階函數,閉包令人嘆為觀止,函數式風格的操作使之前不可想象的操作成為可能。Lisp遞歸玩的實在太溜了,它才是函數式編程語言的王者,循環迭代早成了二等公民。SICP一點點地解釋程序運行的真正本質,分析結構,環境和抽象。我僅僅看到了第二章,就已經目瞪口呆,顛覆了之前不少的概念,讓我極其后悔,為什么沒有在大一大二的時候讀這本書(那會我估計連看都看不懂)。
很多書信息量都很低,一本書壓縮后就剩幾頁紙。但SICP不一樣,這本書不僅無法壓縮,而更需要擴充。所以如果真想了解它的精妙,請直接閱讀它。任何贊美都是乏力的。
我進而迅速地投入了Lisp的懷抱,是否使用Lisp作為工作語言,這一點都不重要,深入之后,你會感受到數學的精致,理性的榮耀。我才發現,Lisp根本就不是語法,而是一種設計。用之前的編程思路去寫Lisp,簡直就是暴殄天物。此時,你不會再抱怨語言限制了思維,只會悔恨自己的思維配不上它的能力。
另外,我發現看書一定要做習題,做習題,做習題。大腦學完知識,檢驗和鞏固知識的最佳方式,就是做習題。覺得課本上講的東西很冗余覺得自己都懂了?做一道習題分分鍾被虐狗。看了大神的對習題的解答,才發現這貨原來是這樣!這可能就是思考的樂趣吧!