新書推薦:
《
艺术家之路 塑造插画风格
》
售價:NT$
759.0
《
古乐钩沉(中国音乐学院60周年校庆中青年学者文集)
》
售價:NT$
602.0
《
我和抑郁症的3000天
》
售價:NT$
301.0
《
与骸骨交谈:我希望每一个真相都被发现
》
售價:NT$
347.0
《
人体使用手册3:自愈力的逻辑(全面解读身体面对疾病时的反应逻辑,学习更多有效的系列家庭按摩)
》
售價:NT$
281.0
《
素描简史:从文艺复兴到现代艺术
》
售價:NT$
1989.0
《
智慧宫丛书028·神工智能 诸神与古代世界的神奇造物
》
售價:NT$
398.0
《
街头健身训练指南
》
售價:NT$
1214.0
|
編輯推薦: |
《Clojure程序设计》是一部Clojure编程经典之作,由Clojure之父作序推荐;
针对Clojure 1.3版本,介绍Clojure的方方面面。
|
內容簡介: |
Clojure是一种基于Java虚拟机的动态编程语言。它功能强大,支持函数式编程,简化了并发编程,并且能调用Java程序。正是这些优点,使其赢得了众多程序员的青睐。《Clojure程序设计》是介绍Clojure编程语言和程序设计的经典之作。第2版针对Clojure
1.3进行了全面的更新。全书共包括10章,分别介绍了Clojure概览和基本特性、序列和函数式编程、并发编程模型、协议和数据类型、宏、多重方法,以及Clojure对Java的调用。最后提供了一个完整了解Clojure应用开发全过程的实例。《Clojure程序设计》适合有不同语言背景而想要学习和了解Clojure编程的程序员阅读。函数式程序员、Java和C#程序员、Lisp程序员,以及Perl、Python和Ruby程序员,都能够通过阅读本书得到不同程度的收获。
|
關於作者: |
Stuart Halloway Clojurecore成员、Relevance公司CTO。 Aaron Bedra
Clojurecore成员,在担任Relevance公司开发者期间,他成为一名技术领袖、演讲家和作家。他对Clojure语言及其支持库贡献颇多,同时也是Clojure社区中的活跃分子。Aaron牵头开发了一些商业的Clojure项目。目前他在Groupon工作。
|
目錄:
|
第1章 启航
1.1 为什么是Clojure
1.1.1 Clojure非常优雅
1.1.2 Clojure是Lisp的再度崛起
1.1.3 为什么是Lisp
1.1.4 它是Lisp,但括号少了
1.1.5 Clojure是函数式语言
1.1.6 Clojure简化了并发编程
1.1.7 Clojure与Java虚拟机彼此亲密无间
1.2 Clojure编程快速入门
1.2.1 使用REPL
1.2.2 特殊变量
1.2.3 添加共享状态
1.3 探索Clojure的程序库
1.3.1 require和use
1.3.2 查找文档
1.4 小结
第2章 探索Clojure
2.1 形式
2.1.1 使用数值类型
2.1.2 符号
2.1.3 字符串与字符
2.1.4 布尔值与nil
2.1.5 映射表、关键字和记录
2.2 读取器宏
2.3 函数
2.3.1 匿名函数
2.3.2 何时使用匿名函数
2.4 变量、绑定和命名空间
2.4.1 绑定
2.4.2 解构
2.4.3 命名空间
2.5 调用Java
2.5.1 访问构造函数、方法和字段
2.5.2 Javadoc
2.6 流程控制
2.6.1 分支结构与if
2.6.2 用do引入副作用
2.6.3 循环与looprecur
2.7 我的for循环哪儿去了
2.8 元数据
2.9 小结
第3章 一切皆序列
3.1 一切皆序列
3.2 使用序列库
3.2.1 创建序列
3.2.2 过滤序列
3.2.3 序列谓词
3.2.4 序列转换
3.3 惰性和无限序列
3.4 Java亦可序化
3.4.1 序化Java容器
3.4.2 序化正则表达式
3.4.3 序化文件系统
3.4.4 序化流
3.4.5 序化XML
3.5 调用特定于结构的函数
3.5.1 列表函数
3.5.2 向量函数
3.5.3 映射表函数
3.5.4 集合函数
3.6 小结
第4章 函数式编程
4.1 函数式编程理念
4.1.1 纯函数
4.1.2 持久性数据结构
4.1.3 惰性和递归
4.1.4 引用透明性
4.1.5 FP的优势
4.1.6 6条规则
4.2 怎样偷个懒
4.2.1 尾递归
4.2.2 自递归与recur
4.2.3 惰性序列
4.2.4 聊聊变现
4.2.5 丢弃头元素
4.3 懒上加懒
4.4 再议递归
4.4.1 转换为自递归
4.4.2 采用Trampolining技术
4.4.3 用惰性化替代递归
4.4.4 用快存为递归抄条近路
4.5 小结
第5章 状态
5.1 并发、并行和锁定
5.2 引用与软事务内存
5.2.1 ref-set
5.2.2 事务的属性
5.2.3 alter
5.2.4 STM的工作原理:MVCC
5.2.5 commute
5.2.6 alter优先
5.2.7 为引用添加验证
5.3 使用原子进行非协同、同步的更新
5.4 使用代理进行异步更新
5.4.1 代理的验证与错误处理
5.4.2 在事务中包含代理
5.4.3 统一的更新模型
5.5 用变量管理线程内状态
5.5.1 远距离作用
5.5.2 用于Java回调API
5.6 Clojure贪吃蛇
5.6.1 函数式模型
5.6.2 使用STM建立可变模型
5.6.3 贪吃蛇的GUI
5.6.4 没有引用的贪吃蛇
5.7 小结
第6章 协议和数据类型
6.1 针对抽象编程
6.2 接口
6.3 协议
6.4 数据类型
6.5 记录
6.6 具体化
6.7 小结
第7章 宏
7.1 何时使用宏
7.2 编写流程控制宏
7.2.1 特殊形式、设计模式和宏
7.2.2 宏展开
7.2.3 when与when-not
7.3 让宏更加简单
7.3.1 语法引述、解引述和解引述拼接
7.3.2 在宏内部创建名称
7.4 宏的分类
7.4.1 有条件的求值
7.4.2 创建变量
7.4.3 Java互操作
7.4.4 延迟求值
7.4.5 对求值进行包装
7.4.6 避免Lambda表达式
7.5 小结
第8章 多重方法
8.1 没有多重方法的日子
8.2 定义多重方法
8.2.1 调度是继承感知的
8.2.2 多重方法的默认值
8.3 调度不简单
8.4 创建特设分类法
8.5 何时应该使用多重方法
8.5.1 Inspector
8.5.2 clojure.test
8.5.3 反例
8.6 小结
第9章 极尽Java之所能
9.1 异常处理
9.1.1 保持简单的异常处理
9.1.2 清理资源
9.1.3 响应异常
9.2 与整数搏斗
9.3 性能优化
9.3.1 使用基本类型提升性能
9.3.2 添加类型提示
9.4 在Clojure中创建Java类
9.4.1 创建Java代理
9.4.2 使用Java容器
9.5 真实世界的例子
9.5.1 真正的持续循环
9.5.2 日志
9.5.3 配置
9.6 小结
第10章 搭建应用
10.1 为电码译员游戏计分
10.2 测试计分器
10.2.1 手工构造输入
10.2.2 运行测试
10.2.3 验证输出
10.2.4 回归测试
10.3 test.generative
10.3.1 生成数据
10.3.2 程序化验证
10.3.3 defspec
10.3.4 运行测试
10.3.5 规格执行失败时
10.3.6 计分函数的产生式测试
10.4 创建用户界面
10.4.1 该是时候处理状态了
10.4.2 玩家界面
10.5 部署代码
10.5.1 Procfile
10.5.2 Heroku库
10.5.3 Git
10.5.4 安置你的应用
10.5.5 部署
10.6 小结
附录 编辑器
参考书目
|
內容試閱:
|
前 言
Clojure是一种基于Java虚拟机(JVM,Java Virtual Machine)的动态编程语言(dynamic
programming language)。它具有以下引人注目的特性。
? Clojure非常优雅。
摒弃了杂乱累赘的语法束缚,Clojure干净、仔细的设计使你在编写代码时总能立刻切入问题的本质。
? Clojure是Lisp的再度崛起。
Clojure从Lisp继承了强大的力量,却未受到Lisp历史的束缚。
? Clojure是一种函数式语言(functional language)。
作为一门函数式语言,Clojure的数据结构具有不可变性(immutable),且大多数函数没有副作用(side
effect)。因此,编写正确的程序更加容易,也能更轻松地将小程序组合成一个大家伙。
? Clojure简化了并发编程。
很多其他语言围绕同步锁(locking)建立的并发模型,难以驾驭。为此,Clojure提供了数个锁机制的替代方案:软事务内存(Software
Transactional Memory,STM)、代理(agent) 、原子(atom)和动态变量(dynamic
variable)。
? Clojure与Java彼此亲密无间。
在Clojure中调用Java代码,无需任何中间的转换层,直接而且快速。
? 不同于许多其他流行的动态语言,Clojure运行飞快。
Clojure的实现利用了现代Java虚拟机上的众多优化技术。
尽管许多其他语言也包含了上述诸多特性中的一部分,但与它们相比,Clojure仍显得魅力非凡。上述任何一个特性,都极为强大和有趣。Clojure的迷人之处在于,将这些特性以非常干净的方式融合在了一起,且做到彼此协作无间。本书的第1章“启航”,将介绍以上这些特性及更多的内容。
谁应该阅读本书
Clojure是一种强大的通用型(general-purpose)编程语言。如果你是一名经验老到的程序员,具备类似C#、Java、Python或者Ruby这样的现代编程语言的开发经验,并正在寻找更为强大、更加优雅的编程语言,那么本书是为你量身定做的。
Clojure构建于Java虚拟机之上,并且运行飞快。如果你是一名对表现力丰富的动态语言馋涎已久,但却因为对性能问题的担忧而裹足不前的Java程序员,那么本书将引起你特别的兴趣。
Clojure有助于重新定义,一种通用型编程语言应该包含哪些特性。如果你使用Lisp,或使用一种诸如Haskell这样的函数式语言,又或者正编写明显存在并发的程序,那你一定会享受Clojure的一切。Clojure融合了来自Lisp、函数式编程和并发编程领域的理念,使得初次接触这些概念的程序员,一切触手可及。
Clojure是本轮编程语言形态大规模演化现象的一部分。诸如Erlang、F#、Haskell和Scala这样的语言,由于它们支持函数式编程,或是由于它们的并发模型,最近都得到了格外的关注。作为这些语言的忠实信徒,你也一定会从Clojure当中找到众多共通之处。
本书主要内容
第1章,启航。本章将展示作为一门通用型语言,Clojure的优雅特质及其函数式风格,以及独特的并发模型如何令其独一无二。阅读完本章,你还将能够轻松完成Clojure的安装,并学会如何使用REPL进行交互式开发。
第2章,探索Clojure。在这里,我们将对Clojure的核心构造进行一次广度优先的概览。完成本章的阅读后,你将能顺畅地阅读大多数常规的Clojure代码。
接下来的两章将讨论函数式编程。第3章,一切皆序列,将展示Clojure如何使用强大的序列隐喻,统一了所有的数据形态。
第4章,函数式编程。本章将向你展示如何编写与序列库代码风格相同的函数式程序。
第5章,状态。本章我们将深入Clojure的并发编程模型。探讨Clojure中用于处理并发问题的4种强大模型。此外还有来自Java并发库中的精华内容一并奉上。
第6章,协议和数据类型。本章将逐个介绍在Clojure中的记录(record)、类型(type)和协议(protocol)。这些概念自Clojure
1.2.0版本首次引入后,在Clojure 1.3.0版本中得到了进一步增强。
第7章,宏。本章将不加掩饰地炫耀这一来自Lisp中的标志性特性—宏(Macros)。你将看到它如何利用“Clojure代码本身就是数据”这一特质,提供了在其他非Lisp语系中极难甚至无法实现的非凡的元编程能力。
第8章,多重方法。本章将讨论Clojure解决多态问题的众多方法中的一种。多态,通常意味着“获取第一个参数的类型,并据此调度到相应的方法”。Clojure的多重方法,使你可以更进一步,选择适用于所有参数的任意函数来进行调度。
第9章,极尽Java之所能。在本章中,你将看到如何从Clojure中调用Java,以及从Java中调用Clojure。你还将看到如何让Clojure疯狂运转,获得原生Java级别的性能。
最后,第10章,搭建应用。本章提供了一个可以让你完整了解Clojure应用开发全过程的视角。在这里,你将从头开始创建一个应用,并深入解决问题的方方面面,同时,还会考虑关于简单和质量的话题。你将借助一组有用的Clojure库,生产并发布一个Web应用。
附录,编辑器。这里列出了可供你选择的Clojure代码编辑器列表,并分别提供链接指向它们各自的安装说明。
如何阅读本书
所有读者都应该按顺序阅读最初的两章。请特别关注1.1节,这里提供了Clojure具备哪些优势的概述,里面的内容你一定会感兴趣。
持续的试验。Clojure提供了一个可以让你立即获取反馈的交互式环境。请阅读1.2.1小节,以获得更多的信息。
读完最初的两章,你就可以随意翻阅了。但如果你打算开始阅读第5章,那么,确保你已经读过了第3章。顺序阅读这几章,将引导你从理解Clojure的不可变数据结构开始,一直到能够利用Clojure强大的并发模型,编写正确的并发程序。
当你开始接触后面各章中那些较长的代码示例时,请确保你使用的编辑器能为你提供Clojure代码自动缩进功能。附录“编辑器”列举了编写Clojure代码的通常选择。如果可能,请尝试使用支持括号匹配功能的编辑器,例如Emacs的paredit模式或者安装了CounterClockWise插件的Eclipse。这些编辑功能将为你顺利学习Clojure编程提供巨大的帮助。
致函数式程序员
?
Clojure的函数式编程之道,在于将理论的纯粹之美,与Clojure需要运行在当前Java虚拟机之上的现实做出了完美的平衡。倘若仔细地阅读了第4章“函数式编程”,你将了解到Clojure与诸如Haskell这样的学院派语言之间存在的风格差异。
?
Clojure的并发模型(第5章),提供了数个直截了当的途径,用于处理并发世界中副作用和状态的问题。这也使得广大读者可以深入地体验函数式编程之魅力。
致Java和C#程序员
?
请认真阅读第2章,Clojure只有很少的语法规则(相比Java或C#而言),所以我们能很快地熟悉它们。
?
请特别留意第7章,Java或C#背景的程序员将会发现,这部分是Clojure与他们所熟悉的语言之间的最大不同。
致Lisp程序员
?
第2章中的一些内容你可能已经很熟悉了,但无论如何,还是应该读一下这一章。Clojure从Lisp中承袭了众多关键特性,但它也在一些地方打破了Lisp传统,这里将会讨论这些内容。
? 请密切关注第4章中的惰性序列。
?
为你的Emacs装备一个“clojure-mode”吧,这将为你享受后面章节中的代码示例提供很大便利。
致Perl、Python和Ruby程序员
? 仔细阅读第5章,在Clojure中,进程内并行计算是一个非常重要的话题。
?
拥抱宏吧(第7章)。但请不要寄予太大的期望,能将你所用语言中的元编程风格轻松套用到Clojure宏中。请牢记,Clojure的宏更为强大,并且,它是在代码读取期间被执行的,而非在运行期执行。
编写体例
以下编写体例将从始至终地贯穿于本书之中。
代码示例采用以下字体。
+ 2 2
为区别代码示例及其执行结果,我们会在执行结果前放置一个箭头(-)。
+ 2 2
- 4
同样,控制台的输出也不容易与示例代码和结果区别开来,因此,我们会在控制台的输出前放置一个管道(|)符。
println "hello"
| hello
- nil
当首次引入某个Clojure形式(form),我们需要说明其语法时,将采用下述表示法。
example-fn required-arg
example-fn optional-arg?
example-fn zero-or-more-arg*
example-fn one-or-more-arg+
example-fn collection-of-variable-args
这是一种非正式的语法,采用?、*、+和符号,用于说明不同的参数传递模式。
Clojure的代码是以程序库的形式进行组织的。如果本书某段示例代码所依赖的库没有包含在Clojure语言核心中,我们将用Clojure的use或require对此加以说明。
use ''[lib-name :only var-names+]
require ''[lib-name :as alias]
此处使用use引入仅出现在列表var-names中的名称。使用require则创建一个库别名,使得每个引入函数的来源更加明晰。例如,来自于clojure.java.io库中的常用函数file。
use ''[clojure.java.io :only file]
file "hello.txt"
- #
或使用基于require的版本。
require ''[clojure.java.io :as io]
iofile "hello.txt"
- #
事实上,如果成功调用了use,Clojure会返回nil。但为使本书更加简洁,这个输出在示例清单中省略了。
在阅读本书期间,你将在名为REPL的Clojure交互式环境中输入代码。REPL的控制台提示符形如下。
user=
提示符中的user表明了你当前所在的Clojure名字空间。在本书大多数的例子中,当前位于哪个名字空间无足轻重。在这种情况下,我们将其省略,采用下述更简洁的语法表示在REPL中发生的一切。
+ 2 2 ; 没有命名空间提示的输入行
- 4 ; 返回值
少数情况下,当位于哪个名字空间非常重要时,我们将采用如下语法。
user= + 2 2 ; 有命名空间提示的输入行
- 4 ;
返回值
Web资源及反馈
本书的英文官方主页 位于Pragmatic
Bookshelf站点。在这里你可以订购本书的纸质版或是电子版,并且下载本书的示例代码。同样,你也可以将你的反馈提交至勘误表或是直接发表至本书论坛
。
下载示例源码
你可以在下列任意位置找到本书的示例源码。
? 本书主页 上有链接指向官方发布的源码。同时,每次本书发布新版时,源码也将得到更新。
? 处于实时更新的本书git源码仓库 。这里有最新、最棒,且有时甚至强过书中所示的源码。
除非另行说明,示例文件都分别放在examples目录中。
贯穿于本书,示例源码的文件名列于源码清单起始位置,并采用灰色背景加以区别。例如,下面的源码清单来自于srcexamplespreface.clj。
srcexamplespreface.clj
println "hello"
如果你正在阅读的是本书的PDF版本,你可以直接点击文件名下载对应的源码清单文件。
有示例源码在手,你就可以准备启航了。首先,我们将领略究竟是怎样的特性组合,使得Clojure如此的独一无二。
|
|