summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-04-24 16:37:28 +0800
committereltrac <hi@eltr.ac>2026-04-24 16:37:28 +0800
commit8f26c431f3779b63c3e4571e227e983644784d30 (patch)
tree1c7637a0eae1cb9270ac56dafc99245783421191
parent4c36b58e7df4df5f2ff737dcb8d0d61972737c4d (diff)
[library] publish /library/2026/living-clojure
-rw-r--r--content/library/2026/living-clojure.md28
1 files changed, 20 insertions, 8 deletions
diff --git a/content/library/2026/living-clojure.md b/content/library/2026/living-clojure.md
index 29f2baac..8d73df17 100644
--- a/content/library/2026/living-clojure.md
+++ b/content/library/2026/living-clojure.md
@@ -4,14 +4,14 @@ slug = 'living-clojure'
tags = ['Lisp','编程']
authors = ['Carin Meier']
rating = 3
-date = 2026-04-23T18:23:10+08:00
+date = 2026-04-24 16:37:14
cover = 'https://img.eltr.ac/geedeapro/library/2026/living-clojure/cover.jpg'
-draft = true
+draft = false
toc = true
toot = ''
+++
-还不错的 Clojure 入门书籍,适合有较强编程基础(我认为至少要熟悉一两门编程语言)的人用来快速了解 Clojure 各方面的特性和编程模式。作者用《爱丽丝梦游仙境》的例子串起了 Clojure 的许多知识,通俗但对不了解这个故事的读者可能有些摸不着头脑,而且大部分例子都不是实际项目里会用到的做法,只能用来理解语法和函数的作用。<!--more-->
+还不错的 Clojure 入门书籍,适合有较强编程基础(我认为至少要熟悉一两门编程语言,有实际开发经验)的人用来快速了解 Clojure 各方面的特性和编程模式。作者用《爱丽丝梦游仙境》的例子串起了 Clojure 的许多知识,通俗但对不了解这个故事的读者可能有些摸不着头脑,而且大部分例子都不是实际项目里会用到的做法,只能用来理解语法和函数的作用。<!--more-->
整体而言,可以把这本书当作不全面的对 Clojure 的快速浏览。由于我一边读一边写了个 [Clojure 项目](https://codeberg.org/eltrac/weepinbell),读到某些章节时我发现我已经熟悉作者要讲的东西了。所以…… 不读书学 Clojure 也完全可行甚至更快?不过读一读有经验的 Clojure 程序员的文字总归是有些帮助的。
@@ -25,7 +25,7 @@ toot = ''
> 有时候,当不需要这些结构化的数据时,你就可以使用 `deftype`,避免为某些你不想要的东西**埋**单。
-95 页也有明显的错误,在介绍 Leinigen 定义依赖的方式时,书本先是给出了 `[org.clojure/clojure "1.6.0"]` 的实例,随后告诉读者上文中的 `group-id` `artifact` 和 `version` 分别代表什么,然而上面根本就没有这些文字!后面举例时,`[org.clojure/clojure "1.6.0"]` 又重复出现了一次,很明显第一次出现的代码应该是 `[group-id/artifact "version"]`。
+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。我认为这是编辑校对的问题,不是翻译问题。
@@ -35,7 +35,7 @@ toot = ''
之所以选这本书,是因为在 [Clojure 官网](https://clojure.org/guides/getting_started#_how_do_i_learn_the_language)上看到了,而且这本书是 O'Reilly 出品的,对发行商印象很好,所以就找了中文版来读。
-书分两个部分,第一部分名叫《Clojure 之旅》,的确名副其实,作者暴风式地把 Clojure 各方面的特性毫不啰唆地讲了一边,信息密度很大的同时也不觉得很难跟上(不过的确需要扎实的编程基础才行)。作者先从 Clojure 的数据结构开始,从简单值讲到容器(Collection)再讲到函数,此时读者就已经对 Clojure 的各种*括号*有基本的认识了,知道 `'()` 是列表、`[]` 是向量、`{}` 是映射、`#{}` 是集合,知道如何定义函数。这基本就是 Clojure 的…… 全部语法了,几乎所有 Lisp 方言都是这样,语法只有括号而已,*非常容易学习*。
+书分两个部分,第一部分名叫《Clojure 之旅》,的确名副其实,作者暴风式地把 Clojure 各方面的特性毫不啰唆地讲了一遍,信息密度很大的同时也不觉得很难跟上(不过的确需要扎实的编程基础才行)。作者先从 Clojure 的数据结构开始,从简单值讲到容器(Collection)再讲到函数,此时读者就已经对 Clojure 的各种*括号*有基本的认识了,知道 `'()` 是列表、`[]` 是向量、`{}` 是映射、`#{}` 是集合,知道如何定义函数。这基本就是 Clojure 的…… 全部语法了,几乎所有 Lisp 方言都是这样,语法只有括号而已,*非常容易学习*。
然后就是如何用 `map` `filter` `reduce` 等等函数操作上述数据,还介绍了惰性,此时读者已经能通过操作序列来做到很多操作了。不过,如果不熟悉函数式编程,可能还是有些不顺手。这本书的缺点也是缺少对函数式编程的讲解,至少我刚开始学 Clojure 的时候还在大量使用 `for`。
@@ -51,13 +51,25 @@ Clojure 比较丑陋的部分是和 Java 相关的,由于这门语言跑在 JV
## 抛砖引玉的写法
-作者在第一部分的后面某一章非常快速地讲解了如何用 Clojure 开发 Web 应用,把后端和前端相关的技术栈都压缩到了一章里,如何启动 Ring 服务器,如何用 Compjure,如何用 ClojureScript 和 Enfocus 库操作 DOM,如何用 Hiccup 生成 HTML,同样是信息密度非常大,但完全没有深入讲解。
+作者在第一部分的后面某一章非常快速地讲解了如何用 Clojure 开发 Web 应用,把后端和前端相关的技术栈都压缩到了一章里,如何启动 Ring 服务器,如何用 Compojure,如何用 ClojureScript 和 Enfocus 库操作 DOM,如何用 Hiccup 生成 HTML,同样是信息密度非常大,但完全没有深入讲解。
-不过这对本身就了解 Web 开发的人不成问题,假设你已经熟悉什么是 DOM,要怎么监听事件实现网页交互,这种凝练的写法就相当于在告诉你:你知道在 JavaScript 里怎么操作 DOM 对吧?在 ClojureScript 里,你只需要用这个库这么写就能达到相同的效果。你知道设计后端 API 一般要返回 JSON 是吧?你可以引入 `ring-json` 中间层帮你自动把 Clojure 数据结构转换为 JSON 字符串响应。我很喜欢这种不讲废话的写法。
+不过这对本身就了解 Web 开发的人不成问题,假设你已经熟悉什么是 DOM,要怎么监听事件实现网页交互,这种凝练的写法就相当于在告诉读者:你知道在 JavaScript 里怎么操作 DOM 对吧?在 ClojureScript 里,你只需要用这个库这么写就能达到相同的效果。你知道设计后端 API 一般要返回 JSON 是吧?你可以引入 `ring-json` 中间层帮你自动把 Clojure 数据结构转换为 JSON 字符串响应。我很喜欢这种不讲废话的写法。
当然,坏处就是不熟悉 Web 开发的人会一脸懵,其他某些章节也是这样。
-在第二部分,作者也继续抛砖引玉,还试图把作者带入 Clojure 程序员社区里,列出了各种有用的工具网站、新闻网站和值得订阅的 Newsletter。有点可惜的是,有一些网站如今已经无法访问了。
+在第二部分,作者也继续抛砖引玉,还试图把读者带入 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,目前考虑的结果是:我还没准备好。
+