第1 章 緒言:為什么是Lisp 1
1.1 為什么是Lisp 2
1.2 Lisp 的誕生 4
1.3 本書面向的讀者 6
第2 章 周而復始:REPL 簡介 8
2.1 選擇一個Lisp 實現 8
2.2 安裝和運行Lisp in a Box 10
2.3 放開思想:交互式編程 10
2.4 體驗REPL 11
2.5 Lisp 風格的“Hello, World” 12
2.6 保存工作成果 13
第3 章 實踐:簡單的數據庫 17
3.1 CD 和記錄 17
3.2 錄入CD 18
3.3 查看數據庫的內容 19
3.4 改進用戶交互 21
3.5 保存和加載數據庫 23
3.6 查詢數據庫 24
3.7 更新已有的記錄——WHERE 再戰(zhàn)江湖 28
3.8 消除重復,獲益良多 29
3.9 總結 33
第4 章 語法和語義 34
4.1 括號里都可以有什么 34
4.2 打開黑箱 34
4.3 S-表達式 36
4.4 作為Lisp 形式的S-表達式 38
4.5 函數調用 39
4.6 特殊操作符 39
4.7 宏 41
4.8 真、假和等價 42
4.9 格式化Lisp 代碼 43
第5 章 函數 46
5.1 定義新函數 46
5.2 函數形參列表 47
5.3 可選形參 48
5.4 剩余形參 49
5.5 關鍵字形參 50
5.6 混合不同的形參類型 51
5.7 函數返回值 52
5.8 作為數據的函數——高階函數 53
5.9 匿名函數 55
第6 章 變量 57
6.1 變量的基礎知識 57
6.2 詞法變量和閉包 60
6.3 動態(tài)變量 61
6.4 常量 65
6.5 賦值 65
6.6 廣義賦值 66
6.7 其他修改位置的方式 67
第7 章 宏:標準控制構造 69
7.1 WHEN 和UNLESS 70
7.2 COND 71
7.3 AND、OR 和NOT 72
7.4 循環(huán) 72
7.5 DOLIST 和DOTIMES 73
7.6 DO 74
7.7 強大的LOOP 76
第8 章 如何自定義宏 78
8.1 Mac 的故事:只是一個故事 78
8.2 宏展開期和運行期 79
8.3 DEFMACRO 80
8.4 示例宏:do-primes 81
8.5 宏形參 82
8.6 生成展開式 83
8.7 堵住漏洞 84
8.8 用于編寫宏的宏 88
8.9 超越簡單宏 90
第9 章 實踐:建立單元測試框架 91
9.1 兩個最初的嘗試 91
9.2 重構 92
9.3 修復返回值 94
9.4 更好的結果輸出 95
9.5 抽象誕生 97
9.6 測試層次體系 97
9.7 總結 99
第10 章 數字、字符和字符串 101
10.1 數字 101
10.2 字面數值 102
10.3 初等數學 104
10.4 數值比較 106
10.5 高等數學 107
10.6 字符 107
10.7 字符比較 107
10.8 字符串 108
10.9 字符串比較 109
第11 章 集合 111
11.1 向量 111
11.2 向量的子類型 113
11.3 作為序列的向量 114
11.4 序列迭代函數 114
11.5 高階函數變體 116
11.6 整個序列上的操作 117
11.7 排序與合并 118
11.8 子序列操作 118
11.9 序列謂詞 119
11.10 序列映射函數 120
11.11 哈希表 120
11.12 哈希表迭代 122
第12 章 LISP 名字的由來:列表處理 123
12.1 “沒有列表” 123
12.2 函數式編程和列表 126
12.3 “破壞性”操作 127
12.4 組合回收性函數和共享結構 129
12.5 列表處理函數 131
12.6 映射 132
12.7 其他結構 133
第13 章 超越列表:點對單元的其他用法 134
13.1 樹 134
13.2 集合 136
13.3 查詢表:alist 和plist 137
13.4 DESTRUCTURING-BIND 141
第14 章 文件和文件I/O 143
14.1 讀取文件數據 143
14.2 讀取二進制數據 145
14.3 批量讀取 145
14.4 文件輸出 145
14.5 關閉文件 146
14.6 文件名 147
14.7 路徑名如何表示文件名 149
14.8 構造新路徑名 150
14.9 目錄名的兩種表示方法 152
14.10 與文件系統(tǒng)交互 153
14.11 其他I/O 類型 154
第15 章 實踐:可移植路徑名庫 157
15.1 API 157
15.2 *FEATURES*和讀取期條件化 157
15.3 列目錄 159
15.4 測試文件的存在 162
15.5 遍歷目錄樹 164
第16 章 重新審視面向對象:廣義函數 165
16.1 廣義函數和類 166
16.2 廣義函數和方法 167
16.3 DEFGENERIC 168
16.4 DEFMETHOD 169
16.5 方法組合 171
16.6 標準方法組合 172
16.7 其他方法組合 173
16.8 多重方法 174
16.9 未完待續(xù) 176
第17 章 重新審視面向對象:類 177
17.1 DEFCLASS 177
17.2 槽描述符 178
17.3 對象初始化 179
17.4 訪問函數 182
17.5 WITH-SLOTS 和WITHACCESSORS 185
17.6 分配在類上的槽 186
17.7 槽和繼承 187
17.8 多重繼承 188
17.9 好的面向對象設計 190
第18 章 一些FORMAT 秘訣 191
18.1 FORMAT 函數 192
18.2 FORMAT 指令 193
18.3 基本格式化 194
18.4 字符和整數指令 194
18.5 浮點指令 196
18.6 英語指令 197
18.7 條件格式化 198
18.8 迭代 199
18.9 跳,跳,跳 201
18.10 還有更多 202
第19 章 超越異常處理:狀況和再啟動 203
19.1 Lisp 的處理方式 204
19.2 狀況 205
19.3 狀況處理器 205
19.4 再啟動 207
19.5 提供多個再啟動 210
19.6 狀況的其他用法 211
第20 章 特殊操作符 213
20.1 控制求值 213
20.2 維護詞法環(huán)境 213
20.3 局部控制流 216
20.4 從棧上回退 219
20.5 多值 223
20.6 EVAL-WHEN 224
20.7 其他特殊操作符 227
第21 章 編寫大型程序:包和符號 228
21.1 讀取器是如何使用包的 228
21.2 包和符號相關的術語 230
21.3 三個標準包 230
21.4 定義你自己的包 232
21.5 打包可重用的庫 234
21.6 導入單獨的名字 235
21.7 打包技巧 236
21.8 包的各種疑難雜癥 237
第22 章 高階LOOP 240
22.1 LOOP 的組成部分 240
22.2 迭代控制 241
22.3 計數型循環(huán) 241
22.4 循環(huán)集合和包 242
22.5 等價?然后迭代 243
22.6 局部變量 244
22.7 解構變量 245
22.8 值匯聚 245
22.9 無條件執(zhí)行 247
22.10 條件執(zhí)行 247
22.11 設置和拆除 248
22.12 終止測試 250
22.13 小結 251
第23 章 實踐:垃圾郵件過濾器 252
23.1 垃圾郵件過濾器的核心 252
23.2 訓練過濾器 255
23.3 按單詞來統(tǒng)計 257
23.4 合并概率 259
23.5 反向卡方分布函數 261
23.6 訓練過濾器 262
23.7 測試過濾器 263
23.8 一組工具函數 265
23.9 分析結果 266
23.10 接下來的工作 268
第24 章 實踐:解析二進制文件 269
24.1 二進制文件 269
24.2 二進制格式基礎 270
24.3 二進制文件中的字符串 271
24.4 復合結構 273
24.5 設計宏 274
24.6 把夢想變成現實 275
24.7 讀取二進制對象 277
24.8 寫二進制對象 279
24.9 添加繼承和標記的結構 280
24.10 跟蹤繼承的槽 281
24.11 帶有標記的結構 284
24.12 基本二進制類型 285
24.13 當前對象?! ?88
第25 章 實踐:ID3 解析器 290
25.1 ID3v2 標簽的結構 291
25.2 定義包 292
25.3 整數類型 292
25.4 字符串類型 294
25.5 ID3 標簽頭 297
25.6 ID3 幀 298
25.7 檢測標簽補白 300
25.8 支持ID3 的多個版本 301
25.9 版本化的幀基礎類 303
25.10 版本化的具體幀類 304
25.11 你實際需要哪些幀 305
25.12 文本信息幀 307
25.13 評論幀 309
25.14 從ID3 標簽中解出信息 310
第26 章 實踐:用AllegroServe 進行Web 編程 315
26.1 30 秒介紹服務器端Web 編程 315
26.2 AllegroServe 317
26.3 用AllegroServe 生成動態(tài)內容 320
26.4 生成HTML 321
26.5 HTML 宏 324
26.6 查詢參數 325
26.7 cookie 327
26.8 小型應用框架 329
26.9 上述框架的實現 330
第27 章 實踐:MP3 數據庫 334
27.1 數據庫 334
27.2 定義模式 336
27.3 插入值 338
27.4 查詢數據庫 340
27.5 匹配函數 342
27.6 獲取結果 344
27.7 其他數據庫操作 346
第28 章 實踐:Shoutcast 服務器 348
28.1 Shoutcast 協(xié)議 348
28.2 歌曲源 349
28.3 實現Shoutcast 351
第29 章 實踐:MP3 瀏覽器 357
29.1 播放列表 357
29.2 作為歌曲源的播放列表 359
29.3 操作播放列表 362
29.4 查詢參數類型 365
29.5 樣板HTML 367
29.6 瀏覽頁 368
29.7 播放列表 371
29.8 查找播放列表 373
29.9 運行應用程序 374
第30 章 實踐:HTML 生成庫,解釋器部分 375
30.1 設計一個領域相關語言 375
30.2 FOO 語言 376
30.3 字符轉義 379
30.4 縮進打印器 380
30.5 HTML 處理器接口 381
30.6 美化打印器后臺 382
30.7 基本求值規(guī)則 385
30.8 下一步是什么 389
第31 章 實踐:HTML 生成庫,編譯器部分 390
31.1 編譯器 390
31.2 FOO 特殊操作符 395
31.3 FOO 宏 399
31.4 公共API 401
31.5 結束語 403
第32 章 結論:下一步是什么 404
32.1 查找Lisp 庫 404
32.2 與其他語言接口 406
32.3 讓它工作,讓它正確,讓它更快 406
32.4 交付應用程序 413
32.5 何去何從 415