內容簡介
本書以具體實例的形式講解瞭Clojure語言在不同領域的應用,不僅介紹如何運用Clojure,而且還展示瞭很多常見庫。書中給齣瞭添加瞭注釋的示例代碼,詳細分析並解釋瞭數百個真實世界的編程任務。讀者既可通過本書深入瞭解Clojure的精髓,也可將本書用作參考指南,解決具體問題。
作者簡介
Luke VanderHart是一名Clojure和ClojureScript開發者,目前就職於Cognitect公司(Clojure之父在該公司任CTO)。他是Practical Clojure(Apress)和ClojureScript: Up and Running(O'Reilly)的閤著者之一,目前在北卡羅來納州達勒姆市生活和工作。
Ryan Neufeld通曉多種計算機語言,是一名全能型軟件開發者,熱衷於分布式係統和網絡應用開發。Ryan十分善於為客戶解決各種或棘手或簡單的軟件技術問題,及時為客戶交付成果。他目前居住於北卡羅來納州達勒姆市,是Cognitect公司的一名開發人員。
內頁插圖
目錄
譯者序 xi
前言 xiii
第1 章 原生數據 1
1.0 簡介 1
1.1 改變字符串的大小寫 2
1.2 清除字符串中的空白字符 3
1.3 利用部件構建字符串 5
1.4 將字符串作為字符序列 6
1.5 字符與整數的轉換 7
1.6 格式化字符串 9
1.7 按模式查找字符串 11
1.8 利用正則錶達式從字符串中取齣值 12
1.9 對字符串執行查找和替換 13
1.10 將字符串切分成部分 15
1.11 基於數量為字符串加復數 16
1.12 在字符串、符號和關鍵字之間的轉換 18
1.13 利用非常大或非常小的數來保持精度 20
1.14 使用有理數 21
1.15 解析數字 23
1.16 數的截斷和捨入 24
1.17 模糊比較 26
1.18 三角計算 27
1.19 根據不同的進製輸入和輸齣整數 29
1.20 計算數值集閤的統計值 30
1.21 位操作 33
1.22 生成隨機數 34
1.23 操作貨幣 36
1.24 生成唯一ID 37
1.25 得到當前的日期和時間 39
1.26 用字麵值來錶示日期 40
1.27 利用clj-time 解析日期和時間 42
1.28 利用clj-time 格式化日期 43
1.29 比較日期 45
1.30 計算時間間隔的長度 46
1.31 生成一係列的日期和時間 48
1.32 利用原生Java 類型生成一係列日期和時間 49
1.33 根據日期間的關係取得日期 52
1.34 處理時區 53
1.35 將Unix 時間戳轉換成Date 對象 55
1.36 將Date 對象轉換成Unix 時間戳 56
第2 章 復閤數據 58
2.0 簡介 58
2.1 創建列錶 59
2.2 從已有的數據結構創建列錶 61
2.3 在列錶中“添加”一個元素 62
2.4 從列錶中“移除”一個元素 63
2.5 測試是否列錶 64
2.6 創建嚮量 65
2.7 在嚮量中“添加”一個元素 66
2.8 從嚮量中“移除”一個元素 67
2.9 取得索引處的值 68
2.10 設置索引處的值 70
2.11 創建集 71
2.12 在集中添加和移除元素 73
2.13 測試集成員 74
2.14 使用集操作 76
2.15 創建映射錶 77
2.16 從映射錶中取得值 79
2.17 從映射錶中同時取齣多個鍵 82
2.18 設置映射錶中的鍵 84
2.19 用復閤值作為映射錶的鍵 86
2.20 將映射錶作為序列(或反過來) 88
2.21 對映射錶應用函數 90
2.22 一個鍵保存多個值 92
2.23 閤並映射錶 95
2.24 值的比較與排序 97
2.25 從集閤中移除重復元素 100
2.26 檢測集閤是否包含幾個值中的一個 102
2.27 實現定製的數據結構:紅黑樹(第一部分) 103
2.28 實現定製的數據結構:紅黑樹(第二部分) 106
第3 章 廣義計算 111
3.0 簡介 111
3.1 運行最小的Clojure REPL 111
3.2 交互式文檔 112
3.3 探索命名空間 114
3.4 嘗試庫而不指明依賴關係 116
3.5 運行Clojure 程序 117
3.6 從命令行運行程序 119
3.7 解析命令行參數 121
3.8 創建定製的項目模闆 124
3.9 構建具有多態行為的函數 128
3.10 擴展內建的類型 133
3.11 用core.async 解除消費者和生産者的耦閤 135
3.12 用core.match 為Clojure 錶達式製作解析器 138
3.13 用core.logic 查詢層級圖 141
3.14 演奏兒歌 146
第4 章 本地I/O 150
4.0 簡介 150
4.1 寫入STDOUT 和STDERR 150
4.2 從控製颱讀入一次擊鍵 152
4.3 執行係統命令 153
4.4 訪問資源文件 156
4.5 復製文件 157
4.6 刪除文件或目錄 159
4.7 列齣目錄中的文件 161
4.8 文件的內存映射 163
4.9 讀寫文本文件 164
4.10 使用臨時文件 165
4.11 在任意位置讀寫文件 166
4.12 並行文件處理 168
4.13 帶歸約的並行文件處理 170
4.14 讀寫Clojure 數據 172
4.15 在配置文件中使用edn 174
4.16 將記錄作為edn 值發布 178
4.17 讀取Clojure 數據時處理未知的帶標簽字麵值 180
4.18 從文件中讀取屬性 182
4.19 讀寫二進製文件 184
4.20 讀寫CSV 數據 186
4.21 讀寫壓縮文件 187
4.22 處理XML 數據 189
4.23 讀寫JSON 數據 190
4.24 生成PDF 文件 192
4.25 生成帶可滾動文本的GUI 窗口 196
第5 章 網絡I/O 和Web 服務 200
5.0 簡介 200
5.1 發齣HTTP 請求 200
5.2 執行異步HTTP 請求 202
5.3 發齣Ping 請求 204
5.4 取得並解析RSS 數據 205
5.5 發送郵件 206
5.6 用RabbitMQ 實現隊列通信 210
5.7 通過MQTT 與嵌入式設備通信 215
5.8 並發使用ZeroMQ 219
5.9 創建TCP 客戶端 222
5.10 創建TCP 服務器 223
5.11 收發UDP 包 227
第6 章 數據庫 230
6.0 簡介 230
6.1 連接SQL 數據庫 231
6.2 利用連接池連接SQL 數據庫 233
6.3 操作SQL 數據庫 236
6.4 用Korma 簡化SQL 242
6.5 用Lucene 進行全文查找 245
6.6 用ElasticSearch 建立數據索引 248
6.7 使用Cassandra 252
6.8 使用MongoDB 256
6.9 使用Redis 259
6.10 連接Datomic 數據庫 262
6.11 為Datomic 數據庫定義數據模式 264
6.12 嚮Datomic 寫入數據 267
6.13 從Datomic 數據庫中刪除數據 270
6.14 嘗試Datomic 事務而不提交 272
6.15 遍曆Datomic 索引 274
第7 章 Web 應用 277
7.0 簡介 277
7.1 Ring 簡介 277
7.2 使用Ring 中間件 279
7.3 用Ring 提供靜態文件 281
7.4 用Ring 處理錶單數據 282
7.5 用Ring 處理Cookie 284
7.6 用Ring 保存會話 286
7.7 在Ring 中讀寫請求和響應的頭 288
7.8 用Compojure 路由請求 289
7.9 用Ring 執行HTTP 重定嚮 291
7.10 用Liberator 構建REST 風格的應用 292
7.11 用Enlive 實現HTML 模闆 294
7.12 用Selmer 實現模闆 300
7.13 用Hiccup 實現模闆 305
7.14 渲染Markdown 文檔 307
7.15 用Luminus 來構建應用 310
第8 章 性能與開發效率 312
8.0 簡介 312
8.1 AOT 編譯 312
8.2 將項目打包成JAR 文件 314
8.3 創建WAR 文件 317
8.4 將應用作為守護進程運行 320
8.5 利用類型暗示減輕性能問題 325
8.6 用原生Java 數組進行快速數學運算 328
8.7 用Timbre 進行簡單剖析 330
8.8 用Timbre 記日誌 332
8.9 嚮Clojars 發布庫 334
8.10 使用宏來簡化API 棄用 336
第9 章 分布式計算 341
9.0 簡介 341
9.1 用Storm 構建活動推送係統 342
9.2 用抽取轉換加載(ETL)管道來處理數據 350
9.3 聚閤大型文件 354
9.4 測試Cascalog 工作流 359
9.5 設置Cascalog 任務的檢查點 361
9.6 解釋Cascalog 查詢 363
9.7 在Elastic MapReduce 上運行Cascalog任
前言/序言
《Clojure編程之道:函數式開發實戰》 內容簡介 本書並非 Clojure 語言的入門指南,也非某一本特定書籍的“影子”。它是一本專注於 Clojure 在實際項目開發中應用的書籍,旨在幫助讀者深入理解 Clojure 的核心概念,並掌握其在解決復雜軟件工程問題時的強大能力。我們不打算在此重復任何你可能已經閱讀過的 Clojure 基礎知識,而是將精力集中在那些能夠真正提升你開發效率、代碼質量和係統健壯性的實踐方法上。 麵嚮讀者 本書適閤已經具備一定 Clojure 基礎,或者對函數式編程理念有一定瞭解,並希望將 Clojure 應用於實際項目開發的開發者。無論你是從其他語言轉投 Clojure 懷抱,還是希望深化自己在 Clojure 領域的實踐經驗,本書都將為你提供寶貴的指導。我們假設你已經掌握瞭 Clojure 的基本語法,例如列錶、嚮量、映射、集閤、函數定義、宏等,並對其不可變數據結構和函數式思維模式有所體會。 本書特色 1. 深度實踐驅動: 我們不會僅僅講解理論,而是通過大量的實際代碼示例和項目片段,展示如何在真實場景下運用 Clojure 的特性。這些示例並非憑空捏造,而是提煉自實際開發經驗,力求貼近真實項目的挑戰。 2. 關注關鍵領域: 本書將深入探討 Clojure 在幾個核心領域的應用,包括: 並發與並行: Clojure 對並發的支持是其核心優勢之一。我們將詳細講解 Clojure 的並發原語,如 `atom`、`ref`、`agent`,以及如何使用 `core.async` 構建高效的異步並發係統。重點在於理解這些機製背後的哲學,並學會如何規避並發編程中的常見陷阱。 數據驅動設計: Clojure 的不可變數據結構天然支持數據驅動的設計理念。本書將演示如何利用 Clojure 的數據轉換能力,構建清晰、可維護的數據處理管道,以及如何利用 Clojure 的數據結構輕鬆實現復雜的狀態管理。 宏與元編程: Clojure 的宏功能是其強大錶現力的重要來源。我們將深入探討宏的工作原理,並展示如何編寫有用的宏來簡化代碼、提高抽象級彆,甚至創造領域特定語言(DSL)。 測試與調試: 實踐證明,良好的測試和有效的調試是保證軟件質量的關鍵。本書將介紹 Clojure 中常用的測試框架和工具,並分享一些在調試復雜 Clojure 代碼時的實用技巧。 工具與生態係統: 除瞭語言本身,Clojure 強大的工具和豐富的生態係統也是其吸引力所在。我們將介紹 Leiningen、Boot 等構建工具,以及一些有助於提升開發體驗的常用庫。 3. 強調“為什麼”: 在講解 Clojure 的特性和技術時,我們不僅僅告訴你“怎麼做”,更重要的是解釋“為什麼這樣做”。理解背後的設計理念和權衡,能夠幫助你更好地掌握 Clojure,並將其應用於更廣泛的問題。 4. 超越基礎: 我們不會花費大量篇幅去重復你可能在其他地方已經學過的 Clojure 基礎知識,而是直接切入更高級、更具挑戰性的主題。例如,在討論並發時,我們將直接從 `atom` 和 `ref` 的應用場景齣發,而不是從頭解釋什麼是“可變狀態”和“同步”。 本書結構(非嚴格章節順序,僅為內容方嚮展示) 深入理解 Clojure 的核心數據結構與轉換: 不可變性的力量:為何 Clojure 的數據結構如此重要? 利用 `map`、`filter`、`reduce` 等函數進行高效的數據轉換。 鏈式操作與管道:構建清晰的數據流。 嵌套數據結構的優雅處理。 構建健壯的並發與並行係統: `atom` 的實踐:無鎖狀態管理。 `ref` 與 `dosync`:事務性內存的強大能力。 `agent` 的應用:異步消息傳遞。 `core.async` 深度解析:CSP 模型與協程。 並發模式的比較與選擇。 避免共享的可變狀態:函數式並發的安全性。 宏:Clojure 的超能力: 理解宏的工作原理:代碼生成與轉換。 編寫實用的宏:簡化重復代碼,提升抽象。 構建領域特定語言(DSL)。 宏的調試與注意事項。 常見宏模式的解析。 測試與調試 Clojure 代碼: Clojure 的測試哲學。 `clojure.test` 框架的使用。 屬性測試 (Property-based testing)。 調試 Clojure 代碼的技巧與工具。 利用 REPL 進行交互式開發與調試。 Clojure 的生態係統與工程實踐: Leiningen 與 Boot:項目管理與構建。 常用庫的介紹與實踐:`clojure.string`、`clojure.core.logic`、`schema` 等。 與 Java 的互操作性。 部署與發布 Clojure 應用。 模式與架構: 函數式設計模式在 Clojure 中的體現。 如何設計可伸縮、可維護的 Clojure 係統。 狀態管理模式在 Clojure 中的實現。 我們不做什麼 不提供基礎語法教程: 我們不會花費篇幅去解釋 `def`, `fn`, `let` 等基本語法,假設讀者已經熟悉。 不包含“Hello, World!”: 本書的目標是解決實際問題,而非展示語言的基本功能。 不重復已有的書籍內容: 本書旨在提供獨特的視角和深入的實踐指導,而非對現有材料的簡單復述。 不提供“最佳實踐”的清單: 我們相信理解背後的原理比死記硬背“最佳實踐”更重要。 開啓你的 Clojure 深度之旅 《Clojure編程之道:函數式開發實戰》將帶領你深入 Clojure 的精髓,讓你能夠自信地運用這門強大的語言去解決現實世界中的復雜問題。我們鼓勵讀者積極動手實踐,將書中的概念和技巧融會貫通,最終成為一名齣色的 Clojure 開發者。準備好迎接一次不拘泥於錶麵、直擊核心的 Clojure 學習體驗吧!