From 4c36b58e7df4df5f2ff737dcb8d0d61972737c4d Mon Sep 17 00:00:00 2001 From: eltrac Date: Fri, 24 Apr 2026 15:56:03 +0800 Subject: [library] update draft --- content/library/2026/living-clojure.md | 53 +++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 10 deletions(-) (limited to 'content') diff --git a/content/library/2026/living-clojure.md b/content/library/2026/living-clojure.md index 8ba970ae..29f2baac 100644 --- a/content/library/2026/living-clojure.md +++ b/content/library/2026/living-clojure.md @@ -1,30 +1,63 @@ +++ title = 'Living Clojure' -slug = '' -tags = [] -authors = [] +slug = 'living-clojure' +tags = ['Lisp','编程'] +authors = ['Carin Meier'] rating = 3 date = 2026-04-23T18:23:10+08:00 -cover = '' +cover = 'https://img.eltr.ac/geedeapro/library/2026/living-clojure/cover.jpg' draft = true toc = true toot = '' +++ - +还不错的 Clojure 入门书籍,适合有较强编程基础(我认为至少要熟悉一两门编程语言)的人用来快速了解 Clojure 各方面的特性和编程模式。作者用《爱丽丝梦游仙境》的例子串起了 Clojure 的许多知识,通俗但对不了解这个故事的读者可能有些摸不着头脑,而且大部分例子都不是实际项目里会用到的做法,只能用来理解语法和函数的作用。 + +整体而言,可以把这本书当作不全面的对 Clojure 的快速浏览。由于我一边读一边写了个 [Clojure 项目](https://codeberg.org/eltrac/weepinbell),读到某些章节时我发现我已经熟悉作者要讲的东西了。所以…… 不读书学 Clojure 也完全可行甚至更快?不过读一读有经验的 Clojure 程序员的文字总归是有些帮助的。 ## 对翻译和编辑的…… 吐槽 -我觉得我写技术书籍的第一节都会是翻译相关的内容了…… 之前读的《[整洁架构之道](/library/2026/clean-architecture/)》译得很糟糕,这本其实还能忍受。尽管语句不自然,但至少没有低素质的译者搞事,这本书的译者还是很尊重原作者的。只是有一些句子读起来确实很不自然,影响了理解: +我觉得我写技术书籍的第一节都会是翻译相关的内容了…… 之前读的《[整洁架构之道](/library/2026/clean-architecture/)》译得很糟糕,这本其实还能忍受。尽管语句不自然,但至少没有低素质的译者搞事,还是很尊重原作者的。只是有一些句子读起来确实很不自然,完全保留了英文逻辑,比如: -- “如果我们有一个需要做一系列转变的 Java 对象,这是很有用的。” -- +> “如果我们有一个需要做一系列转变的 Java 对象,这是很有用的。” -这本书的文字编辑似乎也有些疏忽,第 86 页有错别字: +虽有读起来磕磕绊绊,但习惯了就好。不过,这本书的文字编辑似乎常有疏忽,第 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 服务器,如何用 Compjure,如何用 ClojureScript 和 Enfocus 库操作 DOM,如何用 Hiccup 生成 HTML,同样是信息密度非常大,但完全没有深入讲解。 + +不过这对本身就了解 Web 开发的人不成问题,假设你已经熟悉什么是 DOM,要怎么监听事件实现网页交互,这种凝练的写法就相当于在告诉你:你知道在 JavaScript 里怎么操作 DOM 对吧?在 ClojureScript 里,你只需要用这个库这么写就能达到相同的效果。你知道设计后端 API 一般要返回 JSON 是吧?你可以引入 `ring-json` 中间层帮你自动把 Clojure 数据结构转换为 JSON 字符串响应。我很喜欢这种不讲废话的写法。 + +当然,坏处就是不熟悉 Web 开发的人会一脸懵,其他某些章节也是这样。 + +在第二部分,作者也继续抛砖引玉,还试图把作者带入 Clojure 程序员社区里,列出了各种有用的工具网站、新闻网站和值得订阅的 Newsletter。有点可惜的是,有一些网站如今已经无法访问了。 + +这也是我认为这本书很适合有经验的程序员入门 Clojure 的原因,作者不把你当什么都不懂的菜鸟来教,而且点到为止,余下的内容就留下引子让读者自行探索。 -- cgit v1.2.3