+++ title = 'Living Clojure' slug = 'living-clojure' tags = ['Lisp','Clojure','编程'] authors = ['Carin Meier'] rating = 3 date = 2026-04-24 16:37:14 cover = 'https://img.eltr.ac/geedeapro/library/2026/living-clojure/cover.jpg' draft = false toc = true toot = 'https://akk.eltr.ac/objects/50ff4995-d69f-4c57-8f57-9398ee1471a6' +++ 还不错的 Clojure 入门书籍,适合有较强编程基础(我认为至少要熟悉一两门编程语言,有实际开发经验)的人用来快速了解 Clojure 各方面的特性和编程模式。作者用《爱丽丝梦游仙境》的例子串起了 Clojure 的许多知识,通俗但对不了解这个故事的读者可能有些摸不着头脑,而且大部分例子都不是实际项目里会用到的做法,只能用来理解语法和函数的作用。 整体而言,可以把这本书当作不全面的对 Clojure 的快速浏览。由于我一边读一边写了个 [Clojure 项目](https://codeberg.org/eltrac/weepinbell),读到某些章节时我发现我已经熟悉作者要讲的东西了。所以…… 不读书学 Clojure 也完全可行甚至更快?不过读一读有经验的 Clojure 程序员的文字总归是有些帮助的。 ## 对翻译和编辑的…… 吐槽 我觉得我写技术书籍的第一节都会是翻译相关的内容了…… 之前读的《[整洁架构之道](/library/2026/clean-architecture/)》译得很糟糕,这本其实还能忍受。尽管语句不自然,但至少没有低素质的译者搞事,还是很尊重原作者的。只是有一些句子读起来确实很不自然,完全保留了英文逻辑,比如: > “如果我们有一个需要做一系列转变的 Java 对象,这是很有用的。” 虽有读起来磕磕绊绊,但习惯了就好。不过,这本书的文字编辑似乎常有疏忽,第 86 页有错别字: > 有时候,当不需要这些结构化的数据时,你就可以使用 `deftype`,避免为某些你不想要的东西**埋**单。 95 页也有明显的错误,在介绍 Leinigen 定义依赖的方式时,书本先是给出了 `[org.clojure/clojure "1.6.0"]` 的示例,随后告诉读者上文中的 `group-id` `artifact` 和 `version` 分别代表什么,然而上面根本就没有这些文字!后面举例时,`[org.clojure/clojure "1.6.0"]` 又重复出现了一次,很明显第一次出现的代码应该是 `[group-id/artifact "version"]`。 书里还时不时拼错一些单词,比如把 Google 写作 Goole,把 Clojure 写作 Clojur。我认为这是编辑校对的问题,不是翻译问题。 以后的技术书籍我都尽量找英文原本来读,不受翻译的气。只不过英文原版很难找到纸质书,或者说纸质书更贵,我又不太喜欢读电子书。 ## 高信息密度的暴风式旅程 之所以选这本书,是因为在 [Clojure 官网](https://clojure.org/guides/getting_started#_how_do_i_learn_the_language)上看到了,而且这本书是 O'Reilly 出品的,对发行商印象很好,所以就找了中文版来读。 书分两个部分,第一部分名叫《Clojure 之旅》,的确名副其实,作者暴风式地把 Clojure 各方面的特性毫不啰唆地讲了一遍,信息密度很大的同时也不觉得很难跟上(不过的确需要扎实的编程基础才行)。作者先从 Clojure 的数据结构开始,从简单值讲到容器(Collection)再讲到函数,此时读者就已经对 Clojure 的各种*括号*有基本的认识了,知道 `'()` 是列表、`[]` 是向量、`{}` 是映射、`#{}` 是集合,知道如何定义函数。这基本就是 Clojure 的…… 全部语法了,几乎所有 Lisp 方言都是这样,语法只有括号而已,*非常容易学习*。 然后就是如何用 `map` `filter` `reduce` 等等函数操作上述数据,还介绍了惰性,此时读者已经能通过操作序列来做到很多操作了。不过,如果不熟悉函数式编程,可能还是有些不顺手。这本书的缺点也是缺少对函数式编程的讲解,至少我刚开始学 Clojure 的时候还在大量使用 `for`。 我拖了好久才读到第三章,有关状态和并发的内容。这里我略读了,因为,呃…… 这显然不是函数式编程常用的,纯函数的方式很少管理状态,一直递归就好了。不过实际项目中难以做到纯函数式编程,所以了解状态和并发算是务实的选择。 我比较疑惑的是,作者在第三章讲了核心库里提供的 `future` 等并发方式,和 `atom` `agent` 等状态管理方式,可它把同样用来实现并发和状态管理的 `clojure.core.async` 库放到了后面的章节。然而,它们并没有什么分开的理由,只不过 `clojure.core.async` 不在标准库里,要额外引入依赖。所以作者在讲了 Leinigen 的项目管理之后才单独介绍这个库。我是觉得有些没必要。 而且在我看来 `clojure.core.async` 里提供的并发方法要比核心库里的并发和状态管理好用得多。这个库和 Go 语言一样,提供 `go` 代码块和 `channel`,Go 语言程序员可以直接复用 Go 的并发模型。我对 Clojure 的印象是它非常灵活,实现并发和状态管理的方式就有很多种,Clojure 程序员可以自由选择,不需要像 Go 程序员那样遵循同一套最佳实践(尽管我多半还是会用最好用的那套方法)。 Clojure 比较丑陋的部分是和 Java 相关的,由于这门语言跑在 JVM(Java 虚拟机)上,所以可以方便地调用 Java 的库,也因此需要处理面向对象编程。比如,在 Java 里写作 `String.ToUpperCase(...)` 的方法,在 Clojure 里要用专门的点语法,写作 `(.ToUpperCase String ...)`,还有一系列有关创建对象和取对象属性值的语法糖。的确挺方便的,但总觉得不够优雅,因为要记忆的语法变多了。 值得赞许的是,作者一开始就教读者使用 REPL,并且在讲解新特性时鼓励读者自己把代码输入到 REPL 里实验。Lisp 程序员当然是要熟悉 REPL 的,一边了解概念一边实验无疑也能帮助理解。整本书的确有点跳进兔子洞梦游仙境的感觉,而且还配有导游。 ## 抛砖引玉的写法 作者在第一部分的后面某一章非常快速地讲解了如何用 Clojure 开发 Web 应用,把后端和前端相关的技术栈都压缩到了一章里,如何启动 Ring 服务器,如何用 Compojure,如何用 ClojureScript 和 Enfocus 库操作 DOM,如何用 Hiccup 生成 HTML,同样是信息密度非常大,但完全没有深入讲解。 不过这对本身就了解 Web 开发的人不成问题,假设你已经熟悉什么是 DOM,要怎么监听事件实现网页交互,这种凝练的写法就相当于在告诉读者:你知道在 JavaScript 里怎么操作 DOM 对吧?在 ClojureScript 里,你只需要用这个库这么写就能达到相同的效果。你知道设计后端 API 一般要返回 JSON 是吧?你可以引入 `ring-json` 中间层帮你自动把 Clojure 数据结构转换为 JSON 字符串响应。我很喜欢这种不讲废话的写法。 当然,坏处就是不熟悉 Web 开发的人会一脸懵,其他某些章节也是这样。 在第二部分,作者也继续抛砖引玉,还试图把读者带入 Clojure 程序员社区里,列出了各种有用的工具网站、IRC 群组、新闻网站和值得订阅的 Newsletter。有点可惜的是,有一些网站如今已经无法访问了。 这也是我认为这本书很适合有经验的程序员入门 Clojure 的原因,作者不把你当什么都不懂的菜鸟来教,而且点到为止,余下的内容就留下引子让读者自行探索。 ## 练习计划和…… Emacs 本书还提供了练习计划,规定了每周专注什么,每天具体要做些什么事情来练习 Clojure 编程。看起来很贴心,兴许对一些人有用,但我不打算用这个计划。 一方面是我在读到这一章之前就已经用 Clojure 开发过完整项目了,另一方面是这套计划的前四周几乎都是在…… 刷题,直到最后一周才开始做真正的项目,对我来说非常无趣,我更喜欢直接上手,遇到不知道如何实现的需求时再查阅文档找解决方案。 作者 [Carin Meier](https://github.com/gigasquid) 是个 Emacs 用户,有公开她的 [Emacs 配置](https://github.com/gigasquid/emacs-config)。在去网上搜索她之前我就有预感她应该是用 Emacs 写东西的,因为本书第五章第一节的标题就是「配置一个 Clojure 编辑器」,其中虽然提到了 Vim 和别的编辑器,但对 Emacs 的叙述最多,甚至出现了「Emacs 不仅仅是一个编辑器,还是一种生活方式」这句话。此外,她毕竟是个 Clojure 程序员,写 Lisp 的大多都用 Emacs,配置这个编辑器的 DSL 就是一门 Lisp 方言(虽然我也可以用 Fennel 来配置 Neovim)。 最近感觉 Emacs 在我生活中出现的频率有点太高了,总觉得是某种征兆。不过我三次尝试入坑 Emacs 都失败了,前两次都是使用 Doom Emacs,但各种已经配置好的、我不理解的功能让我感到害怕(Neovim 都是我自己从零配置的,我很难上手别人的配置),而且…… *你的启动速度再慢点就能赶上 VS Code 了*。自己从头配置的话,我还没找到容易入门的资料,连装 Evil 都不会(拜托,没有 Vim 键位我怎么活得下去啊!)。 我跑题了,我想说的是这本书的确让我再次考虑要不要用 Emacs,目前考虑的结果是:我还没准备好。