譯者序
第1版贊譽
第2版序言
第1版序言
關于本書
致謝
第1章 Clojure簡介1
1.1 Clojure的概念以及采用的原因1
1.1.1 Clojure:現代化的Lisp語言2
1.1.2 Clojure:務實的函數式編程3
1.1.3 JVM之上的Clojure5
1.2 語言基礎知識6
1.2.1 Lisp語法6
1.2.2 括號8
1.3 宿主互操作性:JVM速成教程9
1.3.1 Java類型、類和對象10
1.3.2 點(.)和new運算符11
1.3.3 線程和并發(fā)性12
1.4 小結12
第2章 Clojure要素:數據結構和函數14
2.1 在REPL上編碼14
2.1.1 Clojure REPL15
2.1.2 “Hello, world!”16
2.1.3 用doc、find-doc和apropos查找文檔17
2.1.4 Clojure語法的另外幾個要點19
2.2 Clojure數據結構21
2.2.1 nil、真值和假值21
2.2.2 字符和字符串22
2.2.3 Clojure數值22
2.2.4 符號和關鍵字23
2.2.5 列表25
2.2.6 向量26
2.2.7 映射28
2.2.8 序列30
2.3 程序結構31
2.3.1 函數31
2.3.2 let形式32
2.3.3 do的副作用33
2.3.4 讀取器宏34
2.4 程序流程35
2.4.1 條件35
2.4.2 邏輯函數37
2.4.3 函數式循環(huán)40
2.4.4 串行宏45
2.5 小結49
第3章 Clojure構件50
3.1 元數據51
3.1.1 Java類型提示53
3.1.2 Java原始類型和數組類型54
3.2 Java異常:try和throw55
3.3 函數56
3.3.1 定義函數57
3.3.2 調用函數63
3.3.3 高階函數64
3.3.4 編寫高階函數67
3.3.5 匿名函數69
3.3.6 關鍵字和符號70
3.4 作用域73
3.4.1 變量和綁定73
3.4.2 重溫let形式78
3.4.3 詞法閉包79
3.5 命名空間79
3.5.1 ns宏80
3.5.2 使用命名空間82
3.6 解構83
3.6.1 向量綁定84
3.6.2 映射綁定85
3.7 讀取器字面量87
3.8 小結89
第4章 多重方法多態(tài)90
4.1 多態(tài)及其類型90
4.1.1 參數化多態(tài)91
4.1.2 隨意多態(tài)91
4.1.3 子類多態(tài)93
4.2 用多重方法實現多態(tài)94
4.2.1 不使用多重方法時的情況94
4.2.2 使用多重方法實現隨意多態(tài)95
4.2.3 多分派98
4.2.4 使用多重方法實現子類多態(tài)99
4.3 小結105
第5章 探索Clojure和Java互操作106
5.1 從Clojure中調用Java107
5.1.1 將Java類導入Clojure107
5.1.2 創(chuàng)建實例108
5.1.3 訪問方法和域108
5.1.4 宏和句點特殊形式109
5.1.5 有助于使用Java的Clojure宏112
5.1.6 實現接口和擴展類114
5.2 將Clojure代碼編譯為Java字節(jié)碼115
5.2.1 示例:兩個計算器的故事116
5.2.2 用gen-class和gen-interface創(chuàng)建Java類和接口118
5.3 從Java調用Clojure122
5.4 小結123
第6章 狀態(tài)和并發(fā)的世界124
6.1 狀態(tài)存在的問題125
6.1.1 共享狀態(tài)的常見問題125
6.1.2 傳統(tǒng)解決方案125
6.2 標識與值的分離127
6.2.1 不可變值128
6.2.2 對象和時間129
6.2.3 不可變性和并發(fā)性130
6.3 Clojure的方法130
6.3.1 不可變性與性能131
6.3.2 托管引用132
6.4 引用132
6.4.1 創(chuàng)建引用132
6.4.2 引用突變133
6.4.3 軟件事務內存135
6.5 代理137
6.5.1 創(chuàng)建代理137
6.5.2 代理突變137
6.5.3 使用代理139
6.5.4 STM事務中的副作用141
6.6 原子141
6.6.1 創(chuàng)建原子142
6.6.2 原子突變142
6.7 變量143
6.7.1 創(chuàng)建變量和根綁定143
6.7.2 變量綁定144
6.8 狀態(tài)及其統(tǒng)一訪問模型145
6.8.1 創(chuàng)建145
6.8.2 讀取145
6.8.3 突變145
6.8.4 事務146
6.8.5 監(jiān)視突變146
6.9 決定使用哪種托管引用類別147
6.10 future和promise148
6.10.1 future148
6.10.2 promise149
6.11 小結150
第7章 通過宏發(fā)展Clojure151
7.1 宏的基礎知識152
7.1.1 文本替換152
7.1.2 unless示例153
7.1.3 宏模板156
7.1.4 回顧:為什么使用宏160
7.2 Clojure內部的宏161
7.2.1 comment161
7.2.2 declare161
7.2.3 defonce162
7.2.4 and162
7.2.5 time163
7.3 編寫自己的宏163
7.3.1 infix164
7.3.2 randomly164
7.3.3 defwebmethod165
7.3.4 defnn166
7.3.5 assert-true167
7.4 小結169
第8章 函數式編程深入研究170
8.1 使用高階函數170
8.1.1 收集函數結果171
8.1.2 對一系列事物進行歸納173
8.1.3 過濾一系列事物174
8.2 部分應用175
8.2.1 函數適配176
8.2.2 定義函數179
8.3 閉包180
8.3.1 自由變量與閉包180
8.3.2 延遲計算與閉包181
8.3.3 閉包與對象182
8.3.4 一個Clojure對象系統(tǒng)184
8.4 小結196
第9章 協(xié)議、記錄和類型197
9.1 表達式問題197
9.1.1 建立示例場景198
9.1.2 對表達式問題的仔細觀察和一些潛在的解決方案201
9.1.3 Clojure多重方法解決方案202
9.2 研究表達式問題的運算端204
9.2.1 def-modus-operandi204
9.2.2 detail-modus-operandi205
9.2.3 跟蹤你的操作方法205
9.2.4 解決方案的錯誤處理和故障點211
9.3 用協(xié)議研究表達式問題的數據類型方面211
9.3.1 defprotocol與extend-protocol212
9.3.2 用defrecord、deftype和reify定義數據類型217
9.4 小結222
第10章 測試驅動開發(fā)及其他223