給講師的貼士
近幾年变屁,如何跟有效地向初學者介紹Lisp的經(jīng)驗開始慢慢被總結(jié)出來:比如哪里是難點最楷,以及我們怎么應(yīng)對厢漩。另外,有一些切換到Lisp的既定主題是必須使學生領(lǐng)會的拗踢,特別是變量脚牍,作用域和賦值。此處的“簡單介紹”的意思已經(jīng)為Common Lisp完全改變了巢墅,包括了一些十分有價值的教學工具诸狭。讓我介紹一些本書的Lisp標記法。
圖形標記法
本書前兩章使用盒子箭頭標記法來描述原始函數(shù)和函數(shù)組合砂缩。在應(yīng)付函數(shù)調(diào)用語法和何時使用引用等細節(jié)問題之前作谚,這種標記法可以讓學生建立起對于計算的基本概念,并了解三種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu):數(shù)字庵芭,字符和列表妹懒。雖然對于富有經(jīng)驗的Lisp程序員來說,程序即是數(shù)據(jù)的概念有很大的好處双吆,但與此同時眨唬,對于新手這也是產(chǎn)生迷惑的主要源頭。盒子箭頭標記法是將數(shù)據(jù)和程序在視覺上分隔開好乐,從而排除大部分語法錯誤匾竿。這種標記法的另一個好處是缺少明確的變量;一個函數(shù)的輸入就是函數(shù)定義外面指向進來的箭頭蔚万。因為沒有函數(shù)盒子標記法的計算機應(yīng)用岭妖,所以前兩章的學習被設(shè)計成為只需要紙和筆就可以快速學習。這種標記方法也將另一些令學生學習時會有挫敗感的東西暫時隔離開來,不用馬上學習一個真實計算機的機械細節(jié)昵慌,編輯表達式和應(yīng)付調(diào)試器假夺。
熟悉其他編程語言的讀者可以花一分鐘的時間快速瀏覽第一章,閱讀最后的總結(jié)斋攀,然后瀏覽第二章學習一些基礎(chǔ)的列表操作原語已卷。
在第三章將會介紹標準EVAL標記法;引用的概念和具名變量的自然使用淳蔼。這個時候侧蘸,親愛的讀者(他或者她)想必已經(jīng)迫不及待的想要扔掉紙和筆來接觸一個真正的計算機了,從這里開始鹉梨,將會真正進入這門令人興奮的課程讳癌。
其他特征
有三個獨特的特征將會首次叔現(xiàn)在第三章;EVAL標記法俯画,Lisp工具箱章節(jié)和Lisp數(shù)據(jù)結(jié)構(gòu)的綜合圖形表述析桥,包括了函數(shù)對象和字符的內(nèi)部結(jié)構(gòu)。
EVAL標記法展示了Lisp表達式是如何一步一步被計算出來的艰垂,函數(shù)是如何應(yīng)用到參數(shù)當中的泡仗,以及變量是如何被創(chuàng)造和綁定。EVAL和APPLY角色不同猜憎,使用這種標記法可以清楚地用圖形化的方法將變量的作用域和語句的無法嵌套結(jié)構(gòu)體現(xiàn)出來娩怎。圖形化的標記法可是用讀者都能記憶和使用的圖形語言來闡述整個計算過程。
Lisp Toolkit章節(jié)介紹Common Lisp提供的豐富的編程輔助工具胰柑,比如DESCRIBE,INSPECT,TRACE,STEP,和調(diào)試器debugger截亦。還有兩個獨立于本書的工具,他們的源代碼在本書的附錄A和附錄B當中柬讨,也可以從發(fā)行商那里獲得軟盤版本崩瓤。第一個工具就是SDRAW,可以用來cons cell簡圖踩官。SDRAW是read-eval-draw學習循環(huán)的一部分却桶,在給初學者講解一些cons cell類型結(jié)構(gòu)的時候是很有用的,特別是在講解CONS蔗牡,LIST和APPEND的區(qū)別的時候颖系。第二個工具就是DTRACE,一個比TRACE手機更詳細輸出信息的追蹤工具包辩越,所以對初學者來說也更有用嘁扼。
最后,Lisp數(shù)據(jù)的圖形表述黔攒,特別是字符的內(nèi)部結(jié)構(gòu)趁啸,有字符的名字强缘,函數(shù),值莲绰,plist和package cells欺旧,幫助學生理解Lisp解釋器的實質(zhì)和字符姑丑,函數(shù)蛤签,變量和打印字符之間的區(qū)別重點。
后續(xù)章節(jié)的組織
第七章將會介紹Applicative Operator栅哀,在這里也會學習到語法閉包(lexical closures)震肮。在第八章,前一版本的書里面龍的故事作為一個流行元素保留了下來留拾,但是此處現(xiàn)在有一個新的設(shè)備支持戳晌,遞歸模板,幫助學生分析遞歸函數(shù)以理解遞歸風格的本質(zhì)痴柔÷儋耍考慮到一些講師喜歡在applicatives之前講述遞歸,有兩章視為這種講學順序特別準備的咳蔚。
本書前八章提倡一種清晰無副作用的編程風格豪嚎。第九章討論I/O,第十章建立一個統(tǒng)一的視角來看賦值(普通變量和全局變量)谈火,和有破壞性的序列操作侈询。第十一章包含了迭代器,DO和DO*在沒有明確賦值的情況下被使用在構(gòu)造健壯的迭代語句糯耍。第十二章介紹結(jié)構(gòu)扔字,第十三章介紹數(shù)組,哈希表和屬性列表温技。最后一張革为,第十四章介紹宏和匯編過程。期間也解釋了語法和動態(tài)作用域的區(qū)別舵鳞,EVAL圖表清晰闡明了宏和特殊變量的語義震檩。
對于簡單的重視
因為Common Lisp是一門很復(fù)雜的語言,所以有一些地方我選擇簡化來更好的適應(yīng)初學者的學習系任。比如1+和1-函數(shù)在本書中被刪去了恳蹲,因為他們的名字容易讓人產(chǎn)生困惑。還有俩滥,本書中使用的的等于斷言就是EQUAL斷言嘉蕾,因為這是最經(jīng)常使用到的等于斷言,其他的諸如EQ霜旧,EQL错忱,EQUALP和=這些斷言將在進階話題中介紹儡率,但是并不是經(jīng)常使用。在一些地方我選擇寫一些簡單明了的函數(shù)而不是引入一個像PUSHNEW這樣的模糊斷言以清。另外我也不嘗試覆蓋所有最前沿的特性儿普,例如多值和包系統(tǒng)。
一些人比較喜歡用Scheme作為入門課程的方言使用掷倔,因為他更加小巧眉孩,相較于Common Lisp來說。但是一個容易實用與教學的Common Lisp子集可以等同于Scheme勒葱,課程語言規(guī)模對于初學者來說并不是最首要的事情浪汪。另一個爭論的焦點就是,一個確定的適合語言的風格凛虽,重用語法閉包可以使用Scheme語法更加優(yōu)雅的表達出來死遭。但是有些地方Common Lisp是優(yōu)于Scheme的,比如對用戶定義宏的支持凯旋,將列表和向量優(yōu)雅的統(tǒng)一到一個序列數(shù)據(jù)類型里呀潭,對于鍵盤參數(shù)的實用極大的擴展了序列函數(shù)的可用性。講強大的力量至非,廠商的支持和內(nèi)建面向?qū)ο缶幊烫厣慕Y(jié)合造就了Common Lisp成為唯一的“工業(yè)強度”水準的Lisp方言钠署。雖然本書側(cè)重的無副作用,合適的編程方式使得Scheme狂熱者們倍感親切睡蟋,但是確實是Common Lisp風格踏幻。
本書已經(jīng)精心設(shè)計來迎合初學的編程人員和沒有計算機背景的學生的基本需求,但是在每一章最后的可選的進階話題提供了豐富的才來來滿足對于跟高級的計算機知識有興趣的人士戳杀。而對于有更加進階的需要的讀者该面,Guy L. Steele Jr.所撰寫的Common lisp:The Language將會是一本更加有用的入門讀物。Common Lisp:The Reference,Franz會是一本更合適的參考書信卡。