Clojure编程.pdf

Clojure编程.pdf
 

书籍描述

编辑推荐
《Clojure编程》基于新版,提供大量优良的样本代码,可让读者在快速入门、提高的同时,并不遗漏必要的初级概念。抛开Clojure不谈,这也是一本值得推荐的编程语言书籍。
或许你现在还不能充分理解Clojure和函数式编程的精髓,或许目前的日常工作还用不到Clojure,但这绝对是一个值得你重视的主题,本书据此精心设计。作者在这一领域有足够的发言权,有能力引导读者从下载/安装开始学起,直到掌握用起进行web开发。
《Clojure编程》写作精良,平易近人,具有非常良好的“信噪比”,可谓最实用而全面的Clojure图书,对Clojure的状态、标识及并发理念,函数式编程以及Clojure生态系统都有完整阐述。如果有人问你“我应该读什么书上的Clojure“,你可以坚定地指向它!

名人推荐
“O’Reilly Radar 博客有口皆碑。”
——Wired
“O’Reilly 凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。”
——Business 2.0
“O’Reilly Conference 是聚集关键思想领袖的绝对典范。”
——CRN
“一本O’Reilly 的书就代表一个有用、有前途、需要学习的主题。”
——Irish Times
“Tim 是位特立独行的商人,他不光放眼于最长远、最广阔的视野并且切实地按照Yogi Berra 的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去Tim 似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。”
——Linux Journal

作者简介
Chas Emerick是软件公司Snowtide informatics的创始人。自2008年以来,致力于Clojure语言本身以及一些开源项目的开发;长期在cemerick.com撰写Clojure、软件开发实践、创业精神,及其他主题的文章。
Brian Carper是一位心理学研究领域的专业程序员,用Clojure从事数据分析与web开发。他开发过一个把Clojure代码转化为CSS代码的编译器以及一个操作关系型数据库的类库,经常在briancarper.net上发表Clojure文章。
Christophe Grand是一个独立顾问,现居法国里昂。他主要从事Clojure培训与编码,参与了Clojure语言的开发,撰写过Enlive和 Moustache类库,也是Counterclockwise——Clojure IDE for Eclipse的贡献者,经常在clj-me.cgrand.net上发表有关Clojure的文章。

目录
第1章 进入Clojure仙境 1
为什么要选择Clojure? 1
获取Clojure 3
Clojure REPL 3
不!括号真的不会让你瞎了眼 6
表达式、操作符、语法以及优先级 7
同像性 10
Clojure Reader 12
命名空间 21
符号解析 23
特殊形式 24
小结 46
这只是开始 48
第1部分 49
第2章 函数式编程 51
所谓函数式编程,到底意味着什么? 52
谈谈值的重要性 52
作为头等公民的函数以及高阶函数 59
函数(功能)的组合 68
纯函数 76
现实生活中的函数式编程 80
第3章 集合类与数据结构 83
抽象优于实现 84
访问集合元素的简洁方式 111
数据结构的类型 115
不可变性和持久性 123
元数据 136
用Clojure的集合来小试牛刀 137
总结 159
第4章 多线程和并发 161
计算在时间和空间内的转换 162
简单的并行化 168
状态和标识 170
Clojure的引用类型 172
并发操作的分类 174
原子类型(Atom) 176
通知和约束 179
ref 182
var 200
Agent 211
使用Java的并发原语 227
总结 228
第2部分 229
第5 章 宏 231
宏到底是什么? 231
编写你的第一个宏 237
调试宏 239
语法 242
什么时候使用宏 245
宏卫生 247
宏的常见用法和模式 253
隐藏参数:&env 和 &form 255
深入 -> 和 ->> 263
总结 266
第6章 数据类型和协议 267
协议(Protocol) 268
扩展已有的类型 270
定义你自己的类型 274
实现协议 284
协议自省 293
协议函数分派的边界场景 295
自己实现一个set 296
总结 304
第7章 多重方法 305
多重方法基础 305
通往层级之路 308
层级 310
真正实现多重! 315
还有几件事 317
最后的思考 321
第3 部分 323
第8章 Clojure项目的组织与构建 325
项目布局 325
构建 339
最后的思考 355
第9章 Java及JVM互操作 357
JVM是Clojure的基础 358
Java类、方法和字段的使用 358
便利的互操作工具 361
异常与错误处理 363
为了效率进行类型提示 367
定义类、实现接口 372
在Java里使用Clojure 386
乐于合作的伙伴 393
第10章 面向REPL的编程 395
交互式开发 395
工具集 400
在REPL里调试、监测和打补丁 412
重定义结构的限制 416
小结 418
第4部分 419
第11章 数字与数学 421
Clojure的数字 421
Clojure数学 427
相等与等值 432
优化数值效率 436
用Clojure可视化芒德布罗集 448
第12章 设计模式 457
依赖注入 459
策略模式 462
责任链 463
面向方面的编程 466
最后的思考 470
第13章 测试 471
不可变值与纯函数 471
clojure.test 473
HTML DSL的成长 482
依赖断言 486
第14章 使用关系数据库 491
clojure.java.jdbc 491
Korma 498
Hibernate 503
最后的思考 510
第15章 使用非关系型数据库 511
安装CouchDB和Clutch 512
基本的CRUD操作 512
视图 513
_changes: 把CouchDB滥用做消息队列 519
可随意点选的消息队列 521
最后的思考 524
第16章 Clojure与Web 525
Clojure栈 525
基石:Ring 526
用Compojure路由请求 533
使用模板 543
最后的思考 552
第17章 布署Clojure Web应用程序 553
Java与Clojure Web架构 553
在本地运行Web应用 561
Web应用程序布署 562
超越简单Web应用程序布署 565
第5部分 567
第18章 明智地选择Clojure类型定义形式 569
第19章 在工作场所引进Clojure 573
只是事实… 573
强调生产效率 574
强调社群 576
审慎 577
第20章 下一步? 579
(dissoc Clojure ‘JVM) 579
4Clojure 580
Overtone 581
core.logic 581
Pallet 582
Avout 582
Heroku上的Clojure 583
关于作者 585

序言
Clojure 是一种动态的、强类型的、寄居在Java 虚拟机(JVM) 上的语言,如今已经是它的第五个年头了。如今它已经被各种背景的程序员热情地应用到几乎所有的领域。Clojure 提供了一些很引人注目的特性来帮助我们解决现代编程所面临的各种挑战:
函数式编程的基础,包括一套性能可y 以和典型的可变数据结构媲美的持久性数据结构
由JVM 所提供的成熟、高效的运行时环境
跟JVM/Java 的互操作能力使得很多架构、运维方面的需求可以得到满足
一套提供并发、并行语义的机制
是一种Lisp 方言,因此提供了非常灵活、强大的元编程能力
Clojure 为那些受编程语言和环境限制而痛苦的程序员提供了一个实际可行的新选择。我们将会通过展示Clojure 与大家每天都会使用的现有技术、类库或者服务的无缝交互来证明这一点。我们会逐步介绍Clojure 的基础知识,从大家最熟悉的一些方面开始而不是从一些枯燥的原理开始。

这本书的目标读者是谁?
我们在写这本书的时候,脑子里面是有一些目标读者的,希望你是其中之一。
Clojure 跟你现在最喜欢的语言在表达力、简洁性和灵活性方面可以匹敌——通常还有所超越,同时还使得你可以不费任何力气就能获得由JVM 所提供的性能、类库、社区以及运维稳定性。这也使得Clojure 很自然地成为Java 程序员(以及使用解释型、不是那么快的非Java 语言的JVM 程序员)的“下一代”语言,因为它们不想因为脱离JVM 而导致写出来的程序性能下降,或者不想因此而放弃之前在JVM 平台上的投资。而对于那些不想放弃语言强大表达力,但是又希望获得一个更可靠、更高效的平台以及更多可以选择的高质量类库的Ruby、Python 程序员来说,Clojure 也是很自然的选择。

职业Java 程序员
这个世界上有成千上万的Java 程序员,有一小部分的Java 程序员工作在极限条件下解决十分重大的问题,通常是一些领域相关的问题。如果你就是这样的一个Java 程序员,那么你可能一直在寻找着更好的工具、技术或者实践方法来提高你的工作效率以贡献更多的价值给你的团队、公司或者社区。而且你可能对于Java 跟其他语言相比所表现出来的种种局限而苦恼,但是你舍不得离开JVM 这个生态系统:它的流程成熟度、大量的第三方库、软件供应商的支持服务以及大量 熟悉Java 的程序员资源,即使其他的语言特性是多么诱人。
你会发现Clojure 是个很不错的选择。它以优异的性能运行在JVM 之上,能够跟现在你已经有的所有的类库,工具以及应用进行交互,而且它比Java 简单很多,同时又更富表达力、更简洁。

Ruby、Python 以及其他程序员
从任何一个方面来讲,Ruby 和Python 都已经不算什么新语言了,但是最近这些年获得了极大的关注(应该可以算是“主流语言”了吧)。不难看出其中的缘由:它们都是极富表达力的动态语言、有很活跃的社区、在很多领域都鼓励最大化程序员的效率。
Clojure 将是你理想的“下一代语言”。作为一个Ruby 或者Python 程序员,你肯定不愿意放弃这些语言所提供的优秀特性,但是又想让你的程序在一个更强劲的平台上运行,可以有更好的运行时性能,更多的类库可供选择。高效寄居于JVM 之上的Clojure 完全满足这些条件,通常在程序简洁性以及工作效率方面更会超出你的期望。
在书里面我们会经常把Clojure 跟Java、Ruby 以及Python 进行比较来把一些概念“翻译”成你的专业领域里面对应的概念。在这些比较里面,我们比较的总是这些语言的权威实现:
Ruby MRI(也称为CRuby)
CPython
Java 6/7
如何阅读这本书
在规划整本书结构的时候,我们准备给大家介绍两方面的内容:一是有关Clojure 语言的细节;另外就是一些实际的、大家都会碰到的实际问题的例子。但是我们努力避免那些不是很成功的规划办法。具体一点来说就是我们避免以一个例子贯穿整本书,这种方式的结果是很多时候例子跟要叙述的概念往往不是那么相关,而且这一个例子可能对于读者来说不是那么熟悉。
有了这个概念之后,我们把这本书分成了两部分,从最基本的概念开始介绍Clojure 的语言细节,这部分大概占了全书的三分之二;从第四部分开始介绍一些具体的、实际生活中的例子。这种清晰的分隔符合了“duplex book”的要求(这个概念最早是Martin Fowler 在 http://martinfowler.com/bliki/DuplexBook.html 里面提到的。)因此,你可以以两种方式来阅读这本书。
从Clojure 的实际应用例子开始
通常学习一门语言最好的办法就是看怎么用它来解决实际的问题。如果你喜欢这种方式,那么希望我们在书的第二部分举的例子有跟你日常做的事情相关的例子,这样你可以自己做个比较:用你自己熟悉的语言怎么做这个事情,再看看书里面介绍的用Clojure 如何解决这个问题。在这个过程中你会遇到很多未知的概念以及语言结构,每当遇到这些问题的时候,你可以以当前的上下文作为线索去书的第一部分查找对应的章节阅读。
自底向上——从Clojure 最基本的概念开始
有时候弄懂一个东西的唯一办法是从基本的概念开始学习,如果你习惯这种方式的话,那么从第一章的第一页开始读是最好的办法了。我们尝试以渐进的方式阐述Clojure 所有基本的原则以及结构,这样做的结果是你很少需要先阅读书的后面章节内容才能理解前面章节的内容。而当你准备自己动手实践的时候,你可以到后面的实践部分挑一个你最感兴趣、跟你要做的事情最相关的一个例子进行阅读。
我们是谁?
我们是三个通过不同途径认识并且喜欢上Clojure 的三个程序员。在写这本书的时候,我们试图把我们对于为什么使用以及如何使用Clojure 的经验告诉大家以让你也可以很好地使用它。
Chas Emerick
Chas 从2008 年的早期开始就一直活跃于Clojure 社区。他给Clojure 语言核心贡献过代码,参与过十多个Clojure 开源项目,并且经常会撰写或者演讲一些有关Clojure 或者软件开发方面的东西。
Chas 维护了Clojure Atlas(http://clojureatlas.com),这是一个以交互式的、可视化的方法帮助大家学习Clojure 及其标准库的一个网站。
Chas 创建了Snowtide 公司( http://snowtide.com),它坐落于马萨诸塞州西部,Chas 的主要领域在于非结构化数据的提取,并且特别擅长于PDF 相关的数据提取。他经常在他的博客(http://cemerick.com)上发表一些有关Clojure、软件开发、企业管理等方面的文章。
Brian Carper
Brian 是一个从Ruby 转过来的Clojure 语言爱好者。他从2008 年开始就使用Clojure 了,不管是自己业余的小项目还是工作中的项目,涉及到的领域从Web 开发到数据分析再到桌面应用编程等。
Brian 是Gaka(https://github.com/briancarper/gaka)的作者,这是一个把Clojure 代码转换成CSS 的编译器;他还是Oyako(https://github.com/briancarper/oyako)的作者,这是一个对象关系映射的类库。他在他的博客 http://briancarper.net 上发表了Clojure 以及其他主题的一些文章。
Christophe Grand
Christophe 是一个迷失在Java 世界的函数式编程爱好者,直到2008 年遇到Clojure,一见钟情!他是好几个软件的作者:Enlive ( http://github.com/cgrand/enlive)是一个HTML/XML 转换、提取以及模板库;Parsley(http://github.com/cgrand/parsley)是一个递增式的parser 生成器;Moustache(http://github.com/cgrand/moustache)是一个为Ring 设计的路由及中间件应用的DSL。
作为一个独立咨询者,他开发并且提供Clojure 培训。他在他的博客
http://clj-me.cgrand.net 上撰写有关Clojure 的文章。
致谢
本书跟其他任何书一样,如果没有那么多人不知疲倦的帮助的话是不会有这本书的。
首先要感谢Clojure 语言的作者Rich Hickey。在短短的几年里,他设计、实现并且把Clojure 引入了这个世界。对于很多人来说这并不只是另外一个工具而已,它重新激起了我们对编程的热爱。除此之外,他个人也教给了我们很多东西——当然是有关编程的,不过同时也学到了他的耐心、品格和眼光。多谢! Rich。
Dave Fayram 和Mike Loukides 对于本书雏形的形成起了至关重要的作用。当然,如果没有我们的编辑Julie Steele 以及所有O'Reilly 那些好人,大家现在也看不到这本书,他们帮我们搞定了出版过程中的一切事宜。
如果没有审校人员的把关,这本书不会有这么高的质量。审校人员有: Sam Aaron、Antoni Batchelli、Tom Faulhaber、Chris Granger、Anthony Grimes、Phil Hagelberg、Tom Hicks、 Alex Miller、William Morgan、Laurent Petit 以及Dean Wampler。同时我们也想感谢那些通过O’Reilly 论坛、Email、Twitter 等等途径给我们书早期预览版提出反馈和建议的读者们。
Michael Fogus 和Chris Houser 在很多方面给了我们灵感。其中之一就是他们在The Joyof Clojure 一书中对于跟REPL 交互内容的显示格式,我们直接照搬过来了。
如果这里少提了任何人,那么请接受我们默默的感谢以及诚挚的歉意,最后我们很高兴能把本书带给大家!
最后,当然感谢的还远远不够
Clojure 社区已经作为我的另外一个家好多年了。这个社区里面的成员都很热情,给我以帮助,是我的榜样。特别是经常在#clojure 频道里出现的人们,不但跟他们成了好朋友,也从他们那里学到了从别的地方学不到的东西。
感谢我的合作者,Christophe 和Brian: 跟你们一起撰写本书对我来说是莫大的荣耀。没有你们的话我是绝对完不成这本书的。
感谢我的父母,Charley 和Darleen: 我对于事物运作原理无法抑制的好奇心、我对于语言以及修辞的热爱、我对于商业的兴趣跟你们早年对我的影响是分不开的。没有你们影响的话,我是不会走上我现在的路的:创建自己的软件公司以及撰写这本书。
最后,感谢我的妻子Krissy: 为了让我能追求自己的理想你做出了那么多牺牲。此时说什么都显得那么苍白,我只说一句:我爱你。
—Chas Emerick, 2012 年2 月

感谢所有帮助创建Clojure 这门语言的社区成员:感谢你们不知疲倦的辛苦工作,你们的工作使得我的职业以及个人编程生活变得那么有趣,使得我的眼界更加开阔。感谢我的合作者Christophe 和 Chas: 我从来没有跟比你们聪明的人工作过。跟你们一起工作我很荣幸。
感谢我的妻子Nicole :我每天晚上打字使得你不能入眠。
—Brian Carper,2012 年2 月
感谢Rich Hickey,你创建了Clojure 并且培育了这么一个友好的社区。
感谢Clojure 社区,你们帮助我提高了我的水平。
感谢我的合作者,Brian 和Chas: 跟你们合作我很荣幸。
A mon professeur Daniel Goffinet, et à ses exercices improbables, qui a radicalement change mon approche de la programmation et de l’informatique—sur ces sujets je lui suis plus redevable qu’à nul autre.
(感谢Daniel Goffinet 教授,他从根本上改变了我对于编程以及计算的看法——在这些主题上我最感谢他。)
A mes parents pour votre amour bien sûr mais aussi pour tout le temps à s’inquiéter que je passais trop de temps sur l’Amstrad.
(感谢我的父母:感谢你们对我的爱以及帮我买的那个8-bit 的计算机,你们 还担心我在上面花太多时间呢。)
A ma compagne Emilie, et mon fils Gaël, merci d’être là et de m’avoir supporté pendant l’écriture de ce livre.
(感谢我的妻子Emilie 和我的孩子Gaël: 感谢你们在我写作过程中对我的支持。)
—Christophe Grand, 2012 年2 月
本书使用的一些格式约定
我们在本书里面使用如下一些约定:
斜体(Italic)
表示一个新词组、URL、邮件地址、文件名或者文件扩展名。
等宽字体(Constant width)
用来表示程序代码,也会用在一个普通段落里面用来引用变量或者函数名,数据库,数据类型、环境变量、表达式以及关键字。
; 以分号开头的行
表示这行文字是由在REPL 里面运行的代码打印( 也就是说,打印到标准输出流或者错误流) 出来的。
;= 以分号 + 等号开头的行
用来表示这是REPL 里面运行的代码的返回值。
加粗的等宽字体(Constant width bold)
表示命令或者其他一些用户应该原封不动地输入的文本。
斜体的等宽字体(Constant width italic)
表示这个文本应该被替换成用户提供的值或者它的值是由上下文确定的。
示例使用
本书的宗旨就是帮助你完成工作。一般而言,你可以在自己的程序和文档中随意使用书中的代码。除非你原样引用大量代码。否则无须联系我们获得授权。例如,在编写程序时引用了本书若干代码片段是无须授权的,然而销售或分发O’Reilly 图书示例光盘则是需要许可授权的。通过引用本书内容以及代码的方式来答疑解难是不必有授权的。而将书中的代码大量加入到你的产品以及文档中,则需要授权。
如果你在引用书中内容时注明出处,我们将不胜感激,但是这不是必需的。引用声明
通常是包含了标题、作者、出版商和ISBN 编码。例如:“Clojure Programming by Chas Emerick, Brian Carper, and Caristophe Grand (O’Reilly). Copyright 2012 Chas Emerick, Brian Carper, and Christophe Grand, 978-1-449-39470-7.”
如果你发现自己对书中代码的使用有失公允, 或是违反了前述条款, 敬请通过 与我们联系。
Safari® Books Online
Safari Books Online 是一个按需索取的电子图书馆,让你能够轻松地在超过7500 本技术及创新参考书和视频中进行检索,快速找到你需要的答案。
订阅之后,你可以在我们的在线图书馆中阅读图书并观看视频。在你的手机或移动设备上读书。在印刷前看到新标题,独家阅读撰写中的原稿,向作者进行反馈。复制粘贴代码示例,管理你的收藏,下载章节,在关键部分加上书签,添加笔记,打印页面,并从大量其他省时的特性中获益。
O’Reilly Media 已将本书上传至Safari Books Online。想访问本书或其他来自O’Reilly和其他出版商的类似主题,可以在(http://my.safaribooksonline.com)进行免费注册。
联系我们
关于书本身的建议或者问题请联系出版商:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 ( 美国或者加拿大)
707-829-0515 ( 国际或者本地)
707-829-0104 ( 传真)
我们为这本书制作了一个网页,会在那里列出勘误表,一些例子以及一些其他的信息,
本书以网址为:http://shop.oreilly.com/product/0636920013754.do
如果想问一些与本书相关的技术问题请发邮件到:bookquestions@oreilly.com
如果想获得更多关于书、教程、论坛或者新闻的话,可以访问我们的网站: http://www.oreilly.com。
在Facebook 上关注我们: http://facebook.com/oreilly
在Twitter 上关注我们: http://twitter.com/oreillymedia
在YouTube 上关注我们: http://www.youtube.com/oreillymedia

文摘
Clojure编程
为什么选择Clojure?因为这个函数式编程语言不仅让你可以利用已有的Java类库、服务以及其它JVM平台资源,而且它能够跟其它动态语言如Ruby、Python相匹敌。有了本书的详细介绍,你可以通过一些示例来学习Clojure的基本原理,而这些示例会跟你已经熟悉的语言有关,示例所涉及的领域以及主题也是你每天工作都会接触到的。
我们通过一些日常的任务来探索Clojure的灵活性,比如web编程、操作最流行的数据库等等。你会很快看到这门语言是如何帮你消除编程实践中的不必要的复杂性,并且给我们提供了解决困难问题的新的思路 -- 包括多线程编程。
* 使用Clojure不会浪费你在Java平台上的已有投资
* 理解Clojure作为JVM上的一门高效LISP方言的优势
* 学习函数式编程如何帮忙消除常见的问题和错误
* 通过久经考验的工具使得并发多线程编程更可追踪、更可靠
* 消除代码对于冗长而复杂的设计模式的依赖
* 利用宏、数据、协议以及多重方法来构建抽象
* 部署大型web应用到成百上千个云节点
Chas Emerick(cemerick.com)
Snowtide Informatics公司创始人,参与开发了Clojure语言本身以及很多的开源项目。
Brian Carper(briancarper.net)
心理学研究领域的职业程序员,创建了一个把Clojure代码编译成CSS代码的编译器以及一个操作关系型数据库的类库。
Christophe Grand(clj-me.cgrand.net)
活跃于法国里昂附近的独立咨询师,参与开发了Clojure语言;创建了Enlive和Moustache这两个类库。

内容简介
《Clojure编程》内容简介:Clojure是一种实用的通用语言,它是传奇语言LISP的方言,可与Ruby、Python等动态语言相媲美,更以无缝Java库、服务,以及拥有JVM系统得天独厚的资源优势而胜出。本书既可以用来熟悉Clojure基础知识与常见例子,也可了解其相关的实践领域与话题,更可以看到这一JVM平台上的LISP如何帮助消除不必要的复杂性,为大家在编程实践中解决最具挑战性的问题开辟新的选择——更具灵活性,更适于Web编程和操作数据库,可以应付更为苛刻的应用程序安全要求,更有效的并发性和并行处理、数据分析能力,以及在未来云环境下的更大的发展潜力。

购买书籍

当当网购书 京东购书 卓越购书

PDF电子书下载地址

相关书籍

搜索更多