出版時(shí)間:2011-10 出版社:人民郵電 作者:Peter Seibel 譯者:田春
Tag標(biāo)簽:無
前言
譯者序 很榮幸,我被授權(quán)翻譯Practical Common Lisp一書。本書是自1994年Common Lisp語言標(biāo)準(zhǔn)化以來,國內(nèi)出版的第一本Common Lisp的中文教材?! isp語言家族最早誕生于1959年,它是人類歷史上第二個(gè)高級(jí)程序設(shè)計(jì)語言(第一個(gè)是Fortran)。那一年,人工智能(AI)專家John McCarthy發(fā)表了具有重大歷史意義的第一篇LISP論文“Recursive Functions of Symbolic Expressions and their Computation by Machine, Part I”,其中介紹了一種運(yùn)行在古老的IBM 704計(jì)算機(jī)上的列表處理語言LISP(LISt Processing,列表處理),借助它可以輕松描述當(dāng)時(shí)人工智能領(lǐng)域用到的各種算法。從此,Lisp語言在包括AI領(lǐng)域在內(nèi)的所有主流計(jì)算機(jī)分支上,都獲得了長足的發(fā)展。Lisp平臺(tái)不但在IBM PC出現(xiàn)之前的幾乎所有計(jì)算機(jī)硬件體系上均有移植,甚至在20世紀(jì)80年代還出現(xiàn)過專門用來運(yùn)行Lisp程序的硬件——Lisp機(jī)。1994年,ANSI標(biāo)準(zhǔn)化的Common Lisp語言將之前歷史上的所有現(xiàn)存Lisp廠商的各種語言和平臺(tái)特性做了一次偉大的總結(jié),從此語言核心不再變化,不但標(biāo)準(zhǔn)化以前的歷史遺留代碼只通過少量修改就可以兼容現(xiàn)代Lisp平臺(tái),而且標(biāo)準(zhǔn)化以后寫出的所有新代碼也都幾乎不經(jīng)任何調(diào)整就可能運(yùn)行在任何一種Common Lisp平臺(tái)上,無論是帶有原生或是字節(jié)碼編譯器的,還是間接轉(zhuǎn)譯成C語言的,或是運(yùn)行在JVM上的。目前至少有13種不同的Common Lisp語言平臺(tái)可以運(yùn)行在現(xiàn)代計(jì)算機(jī)上,其中10種還在廣泛使用中,遠(yuǎn)超過它們所在的操作系統(tǒng)上C和其他語言編譯器的數(shù)量??梢哉f,Lisp語言家族長達(dá)50年的發(fā)展史就是整個(gè)計(jì)算機(jī)發(fā)展史的縮影?! ∥覐?003年大學(xué)三年級(jí)時(shí)開始學(xué)習(xí)Common Lisp語言,至今已有八個(gè)年頭。當(dāng)時(shí)學(xué)習(xí)它的動(dòng)機(jī)基本上是出于對(duì)人工智能(傳統(tǒng)的邏輯和推理、知識(shí)表示等方向)的個(gè)人興趣。不過隨后很快就發(fā)現(xiàn),Common Lisp是一門通用的編程語言,如果不考慮其歷史淵源而只從語言本身的特性來觀察的話,可以說它跟人工智能毫無關(guān)系。在Practical Common Lisp一書中,作者Peter Seibel也談到這個(gè)問題。當(dāng)今有太多的人對(duì)Lisp語言存在類似的誤解,包括相當(dāng)多學(xué)過早期Lisp語言的人還停留在列表(List)是Lisp語言的唯一復(fù)合數(shù)據(jù)類型的認(rèn)識(shí)上。如果讀者從頭到尾學(xué)完了這本書,就會(huì)發(fā)現(xiàn)Common Lisp是一門特性豐富的大型編程語言,不但提供了現(xiàn)代編程語言普遍支持的各種數(shù)據(jù)類型(包括各種數(shù)值類型、字符串、數(shù)組、結(jié)構(gòu)體和哈希表在內(nèi)),還支持幾乎所有的編程范式(面向過程的、函數(shù)式的以及面向?qū)ο蟮模绕鋷в幸惶滋匦载S富且思想獨(dú)到的面向?qū)ο缶幊探涌贑LOS(Common Lisp Object System)和OO擴(kuò)展接口MOP(Meta-Object Protocol)。如果要用一句話來描述Common Lisp中的OO與C++/Java/SmallTalk等語言的OO有何不同,那就是Common Lisp對(duì)象系統(tǒng)完全不是基于消息傳遞的,而是基于廣義函數(shù)的。有興趣的讀者應(yīng)當(dāng)仔細(xì)閱讀本書的第16章和第17章,其中介紹了CLOS的一些入門內(nèi)容?! 〔贿^Lisp語言最吸引人的地方還在于其與眾不同的程序運(yùn)行方式。從C語言一路學(xué)過來的人往往把一門語言的語法及其標(biāo)準(zhǔn)函數(shù)庫視為語言的全部,因?yàn)橐坏┏绦驅(qū)懞茫幾g器就會(huì)將整個(gè)代碼編譯成一個(gè)可執(zhí)行程序或者被其他可執(zhí)行程序使用的庫。接下來語言本身是什么就不重要了,重要的是程序員寫出了什么功能,甚至連編譯器本身是什么都不重要,因?yàn)樗皇且粋€(gè)黑箱,除了簡單的優(yōu)化開關(guān)之外幾乎無法調(diào)整其行為。各種Lisp語言則采用完全不同的方式來運(yùn)行Lisp程序:Lisp平臺(tái)本身是一個(gè)交互式的環(huán)境,它在很大程度上就是用其本身寫成的。用戶的Lisp代碼以編譯或解釋的形式加載到Lisp環(huán)境中,然后跟Lisp語言或平臺(tái)本身的代碼直接融合在一起。換句話說,每一個(gè)Lisp程序都是對(duì)Lisp語言本身的某種形式的擴(kuò)展。然后通過一個(gè)啟動(dòng)函數(shù),整個(gè)程序得以運(yùn)行。聽到這里,讀者似乎看到了Python或者Ruby的影子,但Lisp環(huán)境還有更絕的地方:幾乎所有Lisp平臺(tái)都允許用戶將加載了用戶代碼的整個(gè)環(huán)境從內(nèi)存中導(dǎo)出(dump)為一個(gè)磁盤文件。通過直接加載這個(gè)文件而不是默認(rèn)的那個(gè)只含有Lisp本身的文件,可以迅速地重建導(dǎo)出前的Lisp環(huán)境,從而達(dá)到增量開發(fā)或者哪怕是快速加載已有Lisp程序的目的。最后,和其他語言很不同的一點(diǎn)是,Lisp語言規(guī)范(至少Common Lisp是這樣的)不但包括了如何定義某個(gè)程序組成部分(指的是變量、函數(shù)和類這些東西)的能力,還定義了從Lisp環(huán)境中清除任何程序組成部分以及就地修改它們的能力,并在語義和功能上確保了這些操作不會(huì)破壞運(yùn)行中的Lisp代碼。這導(dǎo)致了Lisp語言的另一個(gè)重要應(yīng)用:通過加載補(bǔ)丁,Lisp系統(tǒng)可以在運(yùn)行中被任意修改,這對(duì)24×7的服務(wù)器端程序的平滑升級(jí)尤為有利。順便說一句,Lisp也是最早引入垃圾收集(GC)機(jī)制的編程語言,Lisp環(huán)境中的任何對(duì)象,一旦失去了來自其他對(duì)象的引用,就會(huì)在某個(gè)時(shí)刻被GC系統(tǒng)從內(nèi)存中清除掉?! ∽x者可能已經(jīng)注意到了我在不停地混用Lisp和Common Lisp兩個(gè)概念。這有兩層含義:首先,存在Common Lisp之外的Lisp語言,更準(zhǔn)確地說是Lisp方言(dialect),至少包括了Emacs Lisp、AutoLISP、Scheme、Racket(前身是PLT Scheme)和Clojure,其中最后一個(gè)是高速發(fā)展中的新興Lisp方言;其次,所有Lisp家族的語言都有很多共性,除了上面描述中帶有Lisp而非Common Lisp字樣的部分以外,還有最大的也是初學(xué)者最容易看到的一點(diǎn),那就是所有Lisp方言都使用前綴表達(dá)式和用小括號(hào)表示的列表,例如 1+1 在Lisp中將寫成(+ 1 1)。很多初學(xué)者一開始都不適應(yīng)前綴表達(dá)式,但我認(rèn)為前綴表達(dá)式是有很多優(yōu)點(diǎn)的:首先,它徹底消除了運(yùn)算符結(jié)合性問題,令表達(dá)式毫無歧義可言;其次,它讓語言處理器更加簡單高效,避免了語法分析的困難。當(dāng)然,一旦習(xí)慣了也就感覺沒什么了?! W(xué)習(xí)本書對(duì)更好地使用其他Lisp方言無疑是大有幫助的。在翻閱書店里關(guān)于AutoLISP(AutoCAD計(jì)算機(jī)輔助設(shè)計(jì)軟件的擴(kuò)展語言)的各種書籍時(shí),我經(jīng)常痛心疾首地發(fā)現(xiàn)這些圖書的作者雖然精通AutoCAD所提供的Lisp編程接口,但寫出的AutoLISP代碼要么極為難看,要么缺乏效率、濫用內(nèi)存。AutoLISP在語法上跟Common Lisp非常接近,本書的大部分內(nèi)容都適用于AutoLISP。因此我強(qiáng)烈推薦所有AutoLISP程序員閱讀本書以加強(qiáng)自身的Lisp素養(yǎng)。同樣的問題對(duì)于Emacs Lisp(GNU Emacs文本編輯器的擴(kuò)展語言)來說也是一樣的。Scheme系的Lisp方言區(qū)別相對(duì)大一些,如果連基本的變量和函數(shù)定義都在形式上完全不同的話(當(dāng)然,思想上是沒什么本質(zhì)區(qū)別的),我恐怕初學(xué)者從本書中學(xué)得Scheme編程思想的機(jī)會(huì)不大,這種情況下還是推薦《計(jì)算機(jī)程序的構(gòu)造和解釋》、Lisp in Small Pieces和The Little Schemer等書籍比較好?! ”緯梢宰鳛槠渌鸆ommon Lisp語言教材的學(xué)習(xí)基礎(chǔ)。在本書的最后一章里,作者給出了很多后續(xù)的教材,在此就不一一重復(fù)了。需要特別指出的是,另一本著名的Common Lisp教材On Lisp(作者Paul Graham,也就是《黑客與畫家》一書的作者)多年前已經(jīng)被我和我的幾位朋友共同翻譯成中文版,細(xì)心的讀者可以從網(wǎng)上輕易地找到它。On Lisp主要介紹Common Lisp的宏編程,這是Common Lisp區(qū)別于其他語言甚至其他Lisp方言的最重要特性。我相信一旦讀者掌握了本書中關(guān)于宏的章節(jié)以后就可以閱讀On Lisp中的進(jìn)階內(nèi)容,從而將自身對(duì)編程語言的認(rèn)識(shí)上升到一個(gè)新的高度,不過更加符合實(shí)用原則的思路還是先把本書讀完。 Common Lisp絕不是一門過時(shí)的編程語言,整個(gè)Common Lisp社區(qū)一直都在高速的發(fā)展之中,近幾年的發(fā)展尤為迅速。在我學(xué)習(xí)Common Lisp的這些年里,我親眼目睹了幾個(gè)Common Lisp平臺(tái)從無到有(ECL、ABCL)或者發(fā)展壯大(SBCL、Clozure CL)的過程。經(jīng)典平臺(tái)(CMUCL、MCL)也得到了良好的維護(hù)并始終跟進(jìn)操作系統(tǒng)的自然發(fā)展。隨著計(jì)算機(jī)硬件的高速發(fā)展,即便相對(duì)保守的Common Lisp商業(yè)平臺(tái)也開始或即將開始支持對(duì)稱多處理器(SMP),其中LispWorks和Scieneer CL都以SMP支持作為主要賣點(diǎn)。第三方軟件包長足發(fā)展,雖然尚未達(dá)到Perl社區(qū)CPAN的水平,但常用的工具包一應(yīng)俱全,其中不乏高質(zhì)量的大型項(xiàng)目。近年來最新的成果Quicklisp包管理平臺(tái),更是將Common Lisp第三方軟件包的安裝過程提升到了前所未有的便捷程度。免費(fèi)平臺(tái)越來越好,商業(yè)平臺(tái)依然昂貴,開源工具蓬勃發(fā)展,所有這些都暗示著Common Lisp語言還保持著旺盛的生命力,唯一的問題是如何讓更多的國內(nèi)計(jì)算機(jī)領(lǐng)域愛好者了解它。這就是我翻譯本書的目的所在?! ∵^去8年里,我一直活躍在國內(nèi)和國際Common Lisp社區(qū)的前沿。我在大學(xué)本科的最后兩年學(xué)完了Common Lisp語言語法的主要部分,讀完了包括本書在內(nèi)的幾本最經(jīng)典的Lisp書籍,并已經(jīng)能夠在當(dāng)時(shí)最常見的CMUCL平臺(tái)(CMU Common Lisp)上編寫一些簡單的程序。后來在網(wǎng)易工作的5年里,我在工作之余從頭研究了一遍Lisp語言的發(fā)展史,親身體會(huì)了包括Lisp機(jī)在內(nèi)的十幾種不同的Common Lisp平臺(tái)或?qū)崿F(xiàn),并自費(fèi)購買了價(jià)值數(shù)千美元的商業(yè)開發(fā)環(huán)境LispWorks,擁用三種主流操作系統(tǒng)上的License。在網(wǎng)易從事Linux系統(tǒng)管理工作期間,我用Common Lisp從頭實(shí)現(xiàn)了一萬行源代碼規(guī)模的SNMP簡單網(wǎng)絡(luò)管理協(xié)議工具包,它可以為任何服務(wù)器端Common Lisp程序添加通過SNMP協(xié)議進(jìn)行遠(yuǎn)程監(jiān)控的能力,也可以作為基于Common Lisp的網(wǎng)絡(luò)監(jiān)控系統(tǒng)的基礎(chǔ)。我還在過去3年里參與維護(hù)了Common Lisp社區(qū)兩個(gè)最重要的可移植網(wǎng)絡(luò)庫之一:usocket,并由于SNMP庫的需要將其從原本只支持TCP擴(kuò)展到了同時(shí)支持UDP,其中對(duì)于LispWorks的UDP支持代碼是完全從頭寫的,因?yàn)楣俜讲⒉恢С帧?009年,我向國際Lisp會(huì)議的投稿被接受,并作為會(huì)議論文集的一部分出版。我是長期擔(dān)任水木社區(qū)函數(shù)型編程板塊的板主之一,專門負(fù)責(zé)Lisp方向的討論和技術(shù)分享。2011年7月,我離開網(wǎng)易以后開始全職從事商業(yè)Lisp軟件相關(guān)的開發(fā)工作??赡芪疫€不是一個(gè)很好的譯者,但作為一個(gè)經(jīng)驗(yàn)豐富的Common Lisp程序員,我相信自己翻譯這本書是合適的?! ∮?jì)算機(jī)領(lǐng)域每天都在高速發(fā)展,新語言和新技術(shù)的產(chǎn)生速度早已超過了一般人的學(xué)習(xí)速度。對(duì)于一個(gè)計(jì)算機(jī)領(lǐng)域的從業(yè)人員或愛好者來說,學(xué)習(xí)通常是為了更好地應(yīng)用,把所有時(shí)間都用來學(xué)習(xí)而無暇具體應(yīng)用也是本末倒置。在這種情況下,有選擇地學(xué)習(xí)最有用、最不易變質(zhì)的知識(shí),以及甄別各種計(jì)算機(jī)知識(shí)的重要程度和相互關(guān)系的能力就顯得非常重要了。從計(jì)算機(jī)語言的發(fā)展歷史來說,如果一門語言可以存活50年,那么它的內(nèi)在生命力很可能保證其繼續(xù)長期存活下去,一個(gè)人用這門語言寫下的代碼也將比其他語言的代碼更有可能長久地造福后人?! 】傊?,希望這本書能將讀者順利帶入Lisp領(lǐng)域。學(xué)習(xí)一門新的語言總是要花些成本的,但我想說,和其他任何語言相比,花在理解Lisp上的時(shí)間和精力將絕對(duì)是物超所值的,即便相當(dāng)多的讀者可能沒有機(jī)會(huì)在短期內(nèi)將Lisp用于他們的日常工作。之所以這樣說是有原因的:C和Lisp是編程語言的兩個(gè)極端,大多數(shù)人已經(jīng)熟悉了C的那一端,但如果他們還熟悉另一端的話,那么迅速理解幾乎所有其他的編程語言將不再是問題?! ∽g者簡介 田春,網(wǎng)名“冰河”,Glority Software資深軟件工程師,前網(wǎng)易杭州研究院高級(jí)開發(fā)工程師和系統(tǒng)管理員,資深Common Lisp程序員;2001~2005年就讀于浙江大學(xué),2003年起開始學(xué)習(xí)Commom Lisp,精通Lisp史和各種實(shí)現(xiàn),2007年起成為 LispWorks 付費(fèi)用戶;Common Lisp社區(qū)的網(wǎng)絡(luò)專家,開源項(xiàng)目cl-net-snmp(SNMP協(xié)議庫)的作者,usocket跨平臺(tái)網(wǎng)絡(luò)庫的主要維護(hù)者,common-lisp.net站點(diǎn)管理員,水木社區(qū)(newsmth.net)函數(shù)型編程語言(FuncProgram)版主,美國Versata/Gensym公司技術(shù)顧問;曾在ILC 2009(國際Lisp會(huì)議)上發(fā)表學(xué)術(shù)論文,在《程序員》雜志上發(fā)表Common Lisp專題文章;曾在2008年翻譯了Paul Graham的On Lisp一書,并在網(wǎng)上撰寫過大量相關(guān)的技術(shù)文章。
內(nèi)容概要
《實(shí)用Common Lisp編程》是一本不同尋常的Common
Lisp入門書?!秾?shí)用Common
Lisp編程》首先從作者的學(xué)習(xí)經(jīng)過及語言歷史出發(fā),隨后用21個(gè)章節(jié)講述了各種基礎(chǔ)知識(shí),主要包括:REPL及Common
Lisp的各種實(shí)現(xiàn)、S-表達(dá)式、函數(shù)與變量、標(biāo)準(zhǔn)宏與自定義宏、數(shù)字與字符以及字符串、集合與向量、列表處理、文件與文件I/O處理、類、FORMAT格式、符號(hào)與包,等等。而接下來的9個(gè)章節(jié)則翔實(shí)地介紹了幾個(gè)有代表性的實(shí)例,其中包含如何構(gòu)建垃圾過濾器、解析二進(jìn)制文件、構(gòu)建ID3解析器,以及如何編寫一個(gè)完整的MP3
Web應(yīng)用程序等內(nèi)容。最后還對(duì)一些未介紹內(nèi)容加以延伸。
《實(shí)用Common Lisp編程》內(nèi)容適合Common Lisp初學(xué)者及對(duì)之感興趣的相關(guān)人士。
作者簡介
Peter Seibel 從作家演變成程序員,又從程序員演變成作家,其職業(yè)生涯可謂一波三折。他在獲得英語專業(yè)學(xué)士學(xué)位后做過一段時(shí)間的記者工作,后來被Web所吸引。在20世 紀(jì)90年代早期,他用Perl建立了Mother Jones雜志和Organic Online網(wǎng)站。他作為WebLogic的早期雇員參與了Java革命,隨后又在加州大學(xué)伯克利分校教授Java編程。他也是第二代Lisp程序員之 一,并曾經(jīng)是Symbolics的早期股東。2003年他辭去技術(shù)工作,潛心研究Lisp,并憑借本書獲得Jolt生產(chǎn)效率大獎(jiǎng)。2009年出版了名噪一 時(shí)的訪談錄《編程人生》(Coders at Work)。
書籍目錄
第1章 緒言:為什么是Lisp
1.1 為什么是Lisp
1.2 Lisp的誕生
1.3 本書面向的讀者
第2章 周而復(fù)始:REPL簡介
2.1 選擇一個(gè)Lisp實(shí)現(xiàn)
2.2 安裝和運(yùn)行Lisp in a Box
2.3 放開思想:交互式編程
2.4 體驗(yàn)REPL
2.5 Lisp風(fēng)格的“Hello, World”
2.6 保存工作成果
第3章 實(shí)踐:簡單的數(shù)據(jù)庫
3.1 CD和記錄
3.2 錄入CD
3.3 查看數(shù)據(jù)庫的內(nèi)容
3.4 改進(jìn)用戶交互
3.5 保存和加載數(shù)據(jù)庫
3.6 查詢數(shù)據(jù)庫
3.7 更新已有的記錄——WHERE再戰(zhàn)江湖
3.8 消除重復(fù),獲益良多
3.9 總結(jié)
第4章 語法和語義
4.1 括號(hào)里都可以有什么
4.2 打開黑箱
4.3 S-表達(dá)式
4.4 作為Lisp形式的S-表達(dá)式
4.5 函數(shù)調(diào)用
4.6 特殊操作符
4.7 宏
4.8 真、假和等價(jià)
4.9 格式化Lisp代碼
第5章 函數(shù)
5.1 定義新函數(shù)
5.2 函數(shù)形參列表
5.3 可選形參
5.4 剩余形參
5.5 關(guān)鍵字形參
5.6 混合不同的形參類型
5.7 函數(shù)返回值
5.8 作為數(shù)據(jù)的函數(shù)——高階函數(shù)
5.9 匿名函數(shù)
第6章 變量
6.1 變量的基礎(chǔ)知識(shí)
6.2 詞法變量和閉包
6.3 動(dòng)態(tài)變量
6.4 常量
6.5 賦值
6.6 廣義賦值
6.7 其他修改位置的方式
第7章 宏:標(biāo)準(zhǔn)控制構(gòu)造
7.1 WHEN和UNLESS
7.2 COND
7.3 AND、OR和NOT
7.4 循環(huán)
7.5 DOLIST和DOTIMES
7.6 DO
7.7 強(qiáng)大的LOOP
第8章 如何自定義宏
8.1 Mac的故事:只是一個(gè)故事
8.2 宏展開期和運(yùn)行期
8.3 DEFMACRO
8.4 示例宏:do-primes
8.5 宏形參
8.6 生成展開式
8.7 堵住漏洞
8.8 用于編寫宏的宏
8.9 超越簡單宏
第9章 實(shí)踐:建立單元測試框架
9.1 兩個(gè)最初的嘗試
9.2 重構(gòu)
9.3 修復(fù)返回值
9.4 更好的結(jié)果輸出
9.5 抽象誕生
9.6 測試層次體系
9.7 總結(jié)
第10章 數(shù)字、字符和字符串
10.1 數(shù)字
10.2 字面數(shù)值
10.3 初等數(shù)學(xué)
10.4 數(shù)值比較
10.5 高等數(shù)學(xué)
10.6 字符
10.7 字符比較
10.8 字符串
10.9 字符串比較
第11章 集合
11.1 向量
11.2 向量的子類型
11.3 作為序列的向量
11.4 序列迭代函數(shù)
11.5 高階函數(shù)變體
11.6 整個(gè)序列上的操作
11.7 排序與合并
11.8 子序列操作
11.9 序列謂詞
11.10 序列映射函數(shù)
11.11 哈希表
11.12 哈希表迭代
第12章 LISP名字的由來:列表處理
12.1 “沒有列表”
12.2 函數(shù)式編程和列表
12.3 “破壞性”操作
12.4 組合回收性函數(shù)和共享結(jié)構(gòu)
12.5 列表處理函數(shù)
12.6 映射
12.7 其他結(jié)構(gòu)
第13章 超越列表:點(diǎn)對(duì)單元的其他用法
13.1 樹
13.2 集合
13.3 查詢表:alist和plist
13.4 DESTRUCTURING-BIND
第14章 文件和文件I/O
14.1 讀取文件數(shù)據(jù)
14.2 讀取二進(jìn)制數(shù)據(jù)
14.3 批量讀取
14.4 文件輸出
14.5 關(guān)閉文件
14.6 文件名
14.7 路徑名如何表示文件名
14.8 構(gòu)造新路徑名
14.9 目錄名的兩種表示方法
14.10 與文件系統(tǒng)交互
14.11 其他I/O類型
第15章 實(shí)踐:可移植路徑名庫
15.1 API
15.2 *FEATURES*和讀取期條件化
15.3 列目錄
15.4 測試文件的存在
15.5 遍歷目錄樹
第16章 重新審視面向?qū)ο螅簭V義函數(shù)
16.1 廣義函數(shù)和類
16.2 廣義函數(shù)和方法
16.3 DEFGENERIC
16.4 DEFMETHOD
16.5 方法組合
16.6 標(biāo)準(zhǔn)方法組合
16.7 其他方法組合
16.8 多重方法
16.9 未完待續(xù)
第17章 重新審視面向?qū)ο螅侯悺?br /> 17.1 DEFCLASS
17.2 槽描述符
17.3 對(duì)象初始化
17.4 訪問函數(shù)
17.5 WITH-SLOTS和WITHACCESSORS
17.6 分配在類上的槽
17.7 槽和繼承
17.8 多重繼承
17.9 好的面向?qū)ο笤O(shè)計(jì)
第18章 一些FORMAT秘訣
18.1 FORMAT函數(shù)
18.2 FORMAT指令
18.3 基本格式化
18.4 字符和整數(shù)指令
18.5 浮點(diǎn)指令
18.6 英語指令
18.7 條件格式化
18.8 迭代
18.9 跳,跳,跳
18.10 還有更多
第19章 超越異常處理:狀況和再啟動(dòng)
19.1 Lisp的處理方式
19.2 狀況
19.3 狀況處理器
19.4 再啟動(dòng)
19.5 提供多個(gè)再啟動(dòng)
19.6 狀況的其他用法
第20章 特殊操作符
20.1 控制求值
20.2 維護(hù)詞法環(huán)境
20.3 局部控制流
20.4 從棧上回退
20.5 多值
20.6 EVAL-WHEN
20.7 其他特殊操作符
第21章 編寫大型程序:包和符號(hào)
21.1 讀取器是如何使用包的
21.2 包和符號(hào)相關(guān)的術(shù)語
21.3 三個(gè)標(biāo)準(zhǔn)包
21.4 定義你自己的包
21.5 打包可重用的庫
21.6 導(dǎo)入單獨(dú)的名字
21.7 打包技巧
21.8 包的各種疑難雜癥
第22章 高階LOOP
22.1 LOOP的組成部分
22.2 迭代控制
22.3 計(jì)數(shù)型循環(huán)
22.4 循環(huán)集合和包
22.5 等價(jià)?然后迭代
22.6 局部變量
22.7 解構(gòu)變量
22.8 值匯聚
22.9 無條件執(zhí)行
22.10 條件執(zhí)行
22.11 設(shè)置和拆除
22.12 終止測試
22.13 小結(jié)
第23章 實(shí)踐:垃圾郵件過濾器
23.1 垃圾郵件過濾器的核心
23.2 訓(xùn)練過濾器
23.3 按單詞來統(tǒng)計(jì)
23.4 合并概率
23.5 反向卡方分布函數(shù)
23.6 訓(xùn)練過濾器
23.7 測試過濾器
23.8 一組工具函數(shù)
23.9 分析結(jié)果
23.10 接下來的工作
第24章 實(shí)踐:解析二進(jìn)制文件
24.1 二進(jìn)制文件
24.2 二進(jìn)制格式基礎(chǔ)
24.3 二進(jìn)制文件中的字符串
24.4 復(fù)合結(jié)構(gòu)
24.5 設(shè)計(jì)宏
24.6 把夢想變成現(xiàn)實(shí)
24.7 讀取二進(jìn)制對(duì)象
24.8 寫二進(jìn)制對(duì)象
24.9 添加繼承和標(biāo)記的結(jié)構(gòu)
24.10 跟蹤繼承的槽
24.11 帶有標(biāo)記的結(jié)構(gòu)
24.12 基本二進(jìn)制類型
24.13 當(dāng)前對(duì)象?!?br />第25章 實(shí)踐:ID3解析器
25.1 ID3v2標(biāo)簽的結(jié)構(gòu)
25.2 定義包
25.3 整數(shù)類型
25.4 字符串類型
25.5 ID3標(biāo)簽頭
25.6 ID3幀
25.7 檢測標(biāo)簽補(bǔ)白
25.8 支持ID3的多個(gè)版本
25.9 版本化的幀基礎(chǔ)類
25.10 版本化的具體幀類
25.11 你實(shí)際需要哪些幀
25.12 文本信息幀
25.13 評(píng)論幀
25.14 從ID3標(biāo)簽中解出信息
第26章 實(shí)踐:用AllegroServe進(jìn)行Web編程
26.1 30秒介紹服務(wù)器端Web編程
26.2 AllegroServe
26.3 用AllegroServe生成動(dòng)態(tài)內(nèi)容
26.4 生成HTML
26.5 HTML宏
26.6 查詢參數(shù)
26.7 cookie
26.8 小型應(yīng)用框架
26.9 上述框架的實(shí)現(xiàn)
第27章 實(shí)踐:MP3數(shù)據(jù)庫
27.1 數(shù)據(jù)庫
27.2 定義模式
27.3 插入值
27.4 查詢數(shù)據(jù)庫
27.5 匹配函數(shù)
27.6 獲取結(jié)果
27.7 其他數(shù)據(jù)庫操作
第28章 實(shí)踐:Shoutcast服務(wù)器
28.1 Shoutcast協(xié)議
28.2 歌曲源
28.3 實(shí)現(xiàn)Shoutcast
第29章 實(shí)踐:MP3瀏覽器
29.1 播放列表
29.2 作為歌曲源的播放列表
29.3 操作播放列表
29.4 查詢參數(shù)類型
29.5 樣板HTML
29.6 瀏覽頁
29.7 播放列表
29.8 查找播放列表
29.9 運(yùn)行應(yīng)用程序
第30章 實(shí)踐:HTML生成庫,解釋器部分
30.1 設(shè)計(jì)一個(gè)領(lǐng)域相關(guān)語言
30.2 FOO語言
30.3 字符轉(zhuǎn)義
30.4 縮進(jìn)打印器
30.5 HTML處理器接口
30.6 美化打印器后臺(tái)
30.7 基本求值規(guī)則
30.8 下一步是什么
第31章 實(shí)踐:HTML生成庫,編譯器部分
31.1 編譯器
31.2 FOO特殊操作符
31.3 FOO宏
31.4 公共API
31.5 結(jié)束語
第32章 結(jié)論:下一步是什么
32.1 查找Lisp庫
32.2 與其他語言接口
32.3 讓它工作,讓它正確,讓它更快
32.4 交付應(yīng)用程序
32.5 何去何從
編輯推薦
由塞貝爾編著的《實(shí)用Common Lisp編程》展示了Lisp的威力,不僅表現(xiàn)在傳統(tǒng)領(lǐng)域上,例如僅使用短短26行代碼就開發(fā)出一個(gè)完整的單元測試框架,而且還表現(xiàn)在一些全新的領(lǐng)域上,諸如解析二進(jìn)制MP3文件、構(gòu)建瀏覽歌曲集的Web應(yīng)用、在Web上傳播音頻流等。讀過本書,你將體會(huì)到Lisp具有Pytl-ion等腳本語言的簡潔性、C++的高效性,以及在設(shè)計(jì)語言擴(kuò)展時(shí)無與倫比的靈活性。 《實(shí)用Common Lisp編程》內(nèi)容適合Common Lisp初學(xué)者及對(duì)之感興趣的相關(guān)人士。
圖書封面
圖書標(biāo)簽Tags
無
評(píng)論、評(píng)分、閱讀與下載