Clojure 經典實例 (Clojure Cookbook: Recipes for Functional Programming) Clojure经典实例

範德哈特 (Luke VanderHart), 諾伊費爾德 (Ryan Neufeld)

買這商品的人也買了...

商品描述

本書以具體實例的形式講解了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查詢

9.7在Elastic MapReduce上運行Cascalog任務

 

第10章測試

10.0簡介

10.1單元測試

10.2用Midje測試

10.3通過隨機輸入進行徹底測試

10.4尋找導致失敗的值

10.5運行基於瀏覽器的測試

10.6追踪代碼執行

10.7用core.typed避免空指針異常

10.8用core.typed驗證Java互操作

10.9用core. typed檢查高階函數

關於作者

關於封面