内容简介
本书以具体实例的形式讲解了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 学习体验吧!