|
-- 會員 / 註冊 --
|
|
|
|
Clojure編程樂趣(第2版) ( 簡體 字) |
作者:[美] Michael Fogus 福格斯 Chris Houser 豪澤 | 類別:1. -> 程式設計 -> 綜合 |
譯者: |
出版社:人民郵電出版社 | 3dWoo書號: 46555 詢問書籍請說出此書號!【缺書】 NT售價: 445 元 |
出版日:3/1/2017 |
頁數:442 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787115443298 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言: |
內容簡介: 這既不是一本Clojure初學指南,也不是一本Clojure的編程操作手冊。本書通過對Clojure詳盡地探究,講述函數式的程序設計方式,幫助讀者理解和體會Clojure編程的樂趣,進而開發出優美的軟件。 全書分為6個部分共17章。第1部分是基礎,包括第1∼3章,從Clojure背后的思想開始,介紹了Clojure的基礎知識,并帶領讀者初步嘗試Clojure編程。第2部分是第4章和第5章,介紹了Clojure的各種數據類型。第3部分是第6章和第7章,介紹了函數式編程的特性。第4部分是第8章∼11章,分別介紹了宏、組合數據域代碼、Clojure對Java的調用,以及并發編程等較為高級的話題。第5部分為第12章和第13章,探討了Clojure的性能問題及其帶給我們的思考。第6部分為第14~17章,介紹了面向數據編程、性能、思考程序以及Clojure的思考方式。 本書適合想要轉向函數式語言或進行并發編程的程序員閱讀,對JVM平臺編程感興趣的程序員,想要學習中高級的Java程序以及Clojure的讀者,均能夠從中獲益。
|
目錄:第1部分 基 礎 第1章 Clojure哲學 3 1.1 Clojure之道 4 1.1.1 簡單 4 1.1.2 專注 5 1.1.3 實用 5 1.1.4 清晰 6 1.1.5 一致 7 1.2 為何(又一種)Lisp 8 1.2.1 優美 8 1.2.2 極度靈活 9 1.3 函數式編程 15 1.3.1 一個可行的函數式編程 定義 15 1.3.2 函數式編程的內涵 16 1.4 Clojure為何不是面向 對象的 16 1.4.1 定義術語 16 1.4.2 命令式“烘烤” 18 1.4.3 OOP提供的大多數東西, Clojure也有 18 1.5 小結 23 第2章 Clojure疾風式教程 24 2.1 基本數據類型 25 2.1.1 數字 25 2.1.2 整數 25 2.1.3 浮點數 26 2.1.4 有理數 26 2.1.5 符號 27 2.1.6 關鍵字 27 2.1.7 字符串 27 2.1.8 字符 28 2.2 組合起來:集合 28 2.2.1 list 28 2.2.2 vector 29 2.2.3 map 29 2.2.4 set 29 2.3 付諸實現:函數 29 2.4 var 30 2.5 函數 30 2.5.1 匿名函數 31 2.5.2 使用def和defn定義命名 函數 31 2.5.3 不同參數數量的函數 32 2.5.4 以#()定義原位(in-place) 函數 33 2.6 局部量、循環和block 33 2.6.1 block 34 2.6.2 局部量 34 2.6.3 循環 35 2.7 防止發生:quote 37 2.7.1 求值 37 2.7.2 Quoting 38 2.7.3 反quote 40 2.7.4 反quote拼接 41 2.7.5 auto-gensym 41 2.8 與Java互操作 41 2.8.1 訪問靜態類成員(僅限于 Clojure) 41 2.8.2 創建Java實例 42 2.8.3 用.運算符訪問Java實例 成員 42 2.8.4 設置Java實例屬性 43 2.8.5 ..宏 43 2.8.6 doto宏 44 2.8.7 定義類 44 2.9 異常環境 44 2.10 命名空間 45 2.10.1 用ns創建命名空間 45 2.10.2 用:require加載其他命名 空間 46 2.10.3 用:refer加載和創建 映射 47 2.10.4 用:refer創建映射 47 2.10.5 用:import加載Java類 48 2.11 小結 48 第3章 小試牛刀 49 3.1 真值 50 3.1.1 什么是真 50 3.1.2 不要創建布爾對象 50 3.1.3 nil vs. false 51 3.2 小心翼翼nil雙關 51 3.3 解構 53 3.3.1 你的任務,你應該選擇 接受 53 3.3.2 解構vector 53 3.3.3 解構map 55 3.3.4 解構函數參數 57 3.3.5 解構vs.訪問器方法 57 3.4 用REPL做試驗 57 3.4.1 試驗seq 57 3.4.2 試驗圖形化 59 3.4.3 知識匯總 60 3.4.4 出錯之時 61 3.4.5 只為樂趣 62 3.5 小結 63 第2部分 數 據 類 型 第4章 標量 67 4.1 理解精度 68 4.1.1 截斷(Truncation) 68 4.1.2 提升(Promotion) 69 4.1.3 上溢(Overflow) 69 4.1.4 下溢(Underflow) 70 4.1.5 舍入錯誤(Rounding errors) 70 4.2 有理數 71 4.2.1 為什么是有理數 71 4.2.2 怎樣才是有理數 72 4.2.3 有理數的合理性 73 4.3 使用關鍵字的時機 73 4.3.1 關鍵字的應用 73 4.3.2 限定關鍵字 75 4.4 符號解析 76 4.4.1 元數據 77 4.4.2 符號與命名空間 78 4.4.3 Lisp-1 78 4.5 正則表達式——第二個 問題 79 4.5.1 語法 79 4.5.2 函數 80 4.5.3 小心可變匹配器 (matcher) 81 4.6 總結 81 第5章 組合數據類型 82 5.1 持久化、序列和 復雜度 83 5.1.1 “你一直用著這個詞。我認 為,這并不意味著它就是你 以為的含義” 83 5.1.2 序列術語及其含義 84 5.1.3 大O 87 5.2 vector:創建和使用其各種 變體 89 5.2.1 構建vector 89 5.2.2 大vector 90 5.2.3 vector當作棧 93 5.2.4 使用vector而非reverse 94 5.2.5 子vector 95 5.2.6 vector當作MapEntry 95 5.2.7 vector不是什么 96 5.3 list:Clojure代碼form的 數據結構 97 5.3.1 像Lisp那樣的list 97 5.3.2 list當作棧 98 5.3.3 list不是什么 98 5.4 如何使用持久化隊列 99 5.4.1 什么都沒有的隊列 99 5.4.2 入隊 100 5.4.3 獲取 101 5.4.4 出隊 101 5.5 持久化set 101 5.5.1 Clojure set的基本 屬性 101 5.5.2 用sorted-set保持set的 順序 103 5.5.3 contains 103 5.5.4 clojure.set 104 5.6 思考map 106 5.6.1 hash map 106 5.6.2 以有序map保持鍵值的 順序 107 5.6.3 用數組map保持插入 順序 108 5.7 知識匯總:在序列里查找 某項的位置 109 5.8 小結 111 第3部分 函數式編程 第6章 惰性與不變性 115 6.1 關于不變性:按照自己的 方式去使用 115 6.1.1 什么是不變性? 116 6.1.2 不變性可以做什么? 116 6.2 設計一個持久化 玩具 118 6.3 惰性 121 6.3.1 以“邏輯與”熟悉惰性 122 6.3.2 理解lazy-seq的秘訣 123 6.3.3 丟掉頭 126 6.3.4 采用無限序列 126 6.3.5 delay和force宏 128 6.4 知識匯總:一個惰性的 快速排序程序 130 6.4 小結 133 第7章 函數式編程 134 7.1 各種形式的函數 134 7.1.1 一等函數 135 7.1.2 高階函數 138 7.1.3 純函數 141 7.1.4 命名實參 143 7.1.5 使用前置條件和后置條件 約束函數 143 7.2 閉包 145 7.2.1 函數返回閉包 146 7.2.2 隱藏參數 147 7.2.3 將閉包當作函數傳遞 148 7.3 遞歸思考 152 7.3.1 普通遞歸 152 7.3.2 尾遞歸和recur 155 7.3.3 勿忘trampoline 157 7.3.4 延續傳遞風格 159 7.4 知識匯總:A*尋路 161 7.4.1 世界 161 7.4.2 近鄰 161 7.4.3 A*實現 163 7.4.4 A*實現的筆記 165 7.5 小結 166 第4部分 大規模設計 第8章 宏 169 8.1 數據即代碼即數據 170 8.1.1 語法quote、反quote和 拼接 171 8.1.2 宏之經驗談 173 8.2 定義控制結構 173 8.2.1 不用語法quote定義控制 結構 174 8.2.2 使用語法quote和反quote 定義控制結構 175 8.3 組合form的宏 176 8.4 使用宏改變form 177 8.5 使用宏控制符號解析 時間 181 8.5.1 回指 181 8.5.2 (可能)有用的選擇性名字 捕獲 182 8.6 使用宏管理資源 183 8.7 知識匯總:返回函數的 宏 184 8.8 小結 187 第9章 組合數據與代碼 188 9.1 命名空間 188 9.1.1 創建命名空間 189 9.1.2 只暴露所需 191 9.1.3 聲明性包含和排除 194 9.2 以通用設計模式探索 Clojure多重方法 194 9.2.1 組成部分 195 9.2.2 用法 196 9.2.3 以多重方法拯救 197 9.2.4 處理繼承行為的特別 繼承 197 9.2.5 解析層次中的沖突 198 9.2.6 真正的最大功率任意 分發 199 9.3 類型、協議和記錄 200 9.3.1 記錄 200 9.3.2 協議 203 9.3.3 用deftype從更原始的 基礎開始構建 211 9.4 知識匯總:國際象棋 移動的流暢構建器 213 9.4.1 Java實現 213 9.4.2 Clojure實現 215 9.5 小結 217 第10章 變化和并發 218 10.1 使用Ref的時機 219 10.1.1 利用ref構建可變 棋盤 221 10.1.2 事務 223 10.1.3 嵌入式事務 225 10.1.4 STM使其簡單的 事情 225 10.1.5 潛在缺陷 226 10.1.6 讓STM不高興的事 227 10.2 利用refs重構 228 10.2.1 解決棋盤例子 228 10.2.2 以commute進行可交換的 改變 230 10.2.3 以ref-set進行普通 改變 231 10.2.4 壓力之下的Ref 232 10.3 使用Agent的時機 233 10.3.1 進程內并發模型vs分布式 并發模型 234 10.3.2 用Agent控制I/O 235 10.3.3 send和send-off之間的 差異 237 10.3.4 錯誤處理 239 10.3.5 何時不用Agent 241 10.4 使用Atom的時機 241 10.4.1 跨線程共享 242 10.4.2 在事務里使用Atom 242 10.5 使用lock的時機 244 10.5.1 使用鎖進行安全 變化 245 10.5.2 使用Java的顯式鎖 246 10.6 var和動態綁定 248 10.6.1 binding宏 248 10.6.2 創建命名var 250 10.6.3 創建匿名var 251 10.6.4 動態作用域 251 10.7 小結 253 第11章 并行 254 11.1 使用future的時機 255 11.2 使用promise的 時機 259 11.2.1 以promise進行并行 任務 260 11.2.2 回調API到阻塞API 261 11.2.3 確定性死鎖 262 11.3 并行 263 11.3.1 pvalues 263 11.3.2 pmap 263 11.3.3 pcalls 264 11.4 reduce/fold 264 11.5 小結 265
第5部分 宿主共生關系 第12章 Java.next 269 12.1 使用proxy動態生成 對象 270 12.2 Clojure gen-class和 GUI程序設計 277 12.2.1 命名空間作為類的 規范 277 12.2.2 命名空間編譯內幕 280 12.2.3 以Clojure探索用戶界面 設計與開發 281 12.3 Clojure同Java數組的 關系 284 12.3.1 數組的類型:原生與 引用 284 12.3.2 數組可變性 286 12.3.3 那個不幸的命名 約定 286 12.3.4 多維數組 287 12.3.5 調用可變方法/構造 函數 288 12.4 所有Clojure函數都 實現…… 288 12.4.1 java.util.Comparator 288 12.4.2 java.lang.Runnable 289 12.4.3 java.util.concurrent. Callable 290
12.5 在Java API里使用 Clojure數據結構 290 12.5.1 java.util.List 291 12.5.2 java.lang.Comparable 291 12.5.3 java.util.RandomAccess 292 12.5.4 java.util.Collection 292 12.5.5 java.util.Set 293 12.6 definterface 293 12.7 慎用異常 295 12.7.1 一點異常的背景 296 12.7.2 運行時異常vs.編譯時 異常 296 12.7.3 處理異常 298 12.7.4 定制異常 299 12.8 小結 300 第13章 ClojureScript 301 13.1 實現VS接口 302 13.2 編譯器內部:分析和 發布 305 13.2.1 編譯步驟 305 13.2.2 Web Audio 307 13.2.3 高級編譯 311 13.2.4 生成extern.js文件 313 13.3 編譯和運行 315 13.4 小結 319 第6部分 雜 項 考 量 第14章 面向數據編程 323 14.1 代碼是代碼,數據是 數據 323 14.1.1 嚴格的分界 324 14.1.2 ORMG 325 14.1.3 從數據中獲取信息的 一般方式 326 14.1.4 PLOP 327 14.2 數據就是數據 327 14.2.1 值的好處 328 14.2.2 標簽符號 332 14.3 數據就是代碼 335 14.3.1 數據可編程引擎 335 14.3.2 可編程數據引擎的 例子 336 14.3.3 例子:簡單的事件 來源 337 14.4 代碼就是數據,也是 代碼 345 14.4.1 哈特的發現和 同像性 346 14.4.2 Clojure代碼就是 數據 346 14.4.3 規范括號 346 14.5 小節 349 第15章 性能 351 15.1 類型提示 352 15.1.1 類型修飾的優勢 352 15.1.2 類型提示實參和 返回值 352 15.1.3 類型提示對象 354 15.2 暫態(transient) 354 15.2.1 短暫的垃圾 354 15.2.2 暫態在效率上與可變集合 相比較 355 15.3 分塊序列 356 15.4 記憶 358 15.4.1 記憶再研究 359 15.4.2 記憶協議 359 15.4.3 面向抽象編程 361 15.5 理解強制轉型 (coercion) 361 15.5.1 使用原始類型long 362 15.5.2 使用原生double 364 15.5.3 使用自動提升精度 365 15.6 可縮小的 366 15.6.1 簡單的精簡集合的 例子 366 15.6.2 派生第一個reducse函數 變種 367 15.6.3 更多的可還原函數的 轉換器 369 15.6.4 reducible轉換器 371 15.6.5 reducible的性能 372 15.6.6 reducible的缺陷 372 15.6.7 整合reducible到Clojure reduce 373 15.6.8 fold函數:并行的 reduce 374 15.7 小結 377
第16章 思考程序 378 16.1 搜索問題 378 16.2 統一思考數據 383 16.2.1 潛在的平等性或 滿足性 384 16.2.2 替換 387 16.2.3 一致性 388 16.3 關于core.logic 390 16.3.1 都是關于一致性 390 16.3.2 關系型 391 16.3.3 子目標 394 16.4 約束 397 16.4.1 約束編程介紹 397 16.4.2 通過有限域限制 綁定 399 16.4.3 利用有限域解決數獨 問題 400 16.5 小結 403 第17章 Clojure改變我們的 思考方式 405 17.1 DSL 406 17.1.1 無所不在的DSL 406 17.1.2 實現類似SQL的DSL用于 生成查詢 408 17.1.3 Clojure方式DSL的 注記 413 17.2 測試 413 17.2.1 一些有用的技術 414 17.2.2 契約式程序設計 416 17.3 缺乏設計模式 417 17.4 錯誤處理和調試 426 17.4.1 錯誤處理 426 17.4.2 調試 429 17.5 珍重 433 附錄 資源 434 Miscellaneous resources 434 Online resources 440
|
序: |
|