内容简介
本书以具体实例的形式讲解了Clojure语言在不同领域的应用,不仅介绍如何运用Clojure,而且还展示了很多常见库。书中给出了添加了注释的示例代码,详细分析并解释了数百个真实世界的编程任务。读者既可通过本书深入了解Clojure的精髓,也可将本书用作参考指南,解决具体问题。
目录
- 译者序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生成唯一ID37
- 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运行最小的ClojureREPL111
- 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/O150
- 4.0简介150
- 4.1写入STDOUT和STDERR150
- 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在配置文件中使用edn174
- 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并发使用ZeroMQ219
- 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简化SQL242
- 6.5用Lucene进行全文查找245
- 6.6用ElasticSearch建立数据索引248
- 6.7使用Cassandra252
- 6.8使用MongoDB256
- 6.9使用Redis259
- 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.1Ring简介277
- 7.2使用Ring中间件279
- 7.3用Ring提供静态文件281
- 7.4用Ring处理表单数据282
- 7.5用Ring处理Cookie284
- 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.1AOT编译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在ElasticMapReduce上运行Cascalog任务365
- 第10章测试367
- 10.0简介367
- 10.1单元测试368
- 10.2用Midje测试372
- 10.3通过随机输入进行彻底测试375
- 10.4寻找导致失败的值379
- 10.5运行基于浏览器的测试381
- 10.6追踪代码执行386
- 10.7用core.typed避免空指针异常389
- 10.8用core.typed验证Java互操作392
- 10.9用core.typed检查高阶函数395
- 关于作者399