这篇文章我们来说说 Clojure 这个语言,Clojure 在 web 领域的生态情况,以及如何配置自己的本地环境使其能够顺畅编写 Clojure 代码。

Clojure 语言介绍

我之前了解到这个语言,主要是一次偶然的机会对 Lisp 系的语言产生了兴趣。

作为一种设计远远超前于当时时代的语言,Lisp 语言生不逢时,未能获得与其优秀设计理念相匹配的广泛普及和应用。

Lisp语言的百科介绍

然而,即便如此,从 Lisp 中诞生的一系列优秀的设计理念并没有被埋没,反而在后续大量的其他语言中被继承,被发扬光大。

举例而言,像是函数式编程的范式、基于宏的元编程思想等等,这些思想在其他各种语言中或多或少地得到了继承和融合。

当然,还有一些更贴近原本 Lisp 的语言。这些语言一般都是在 Lisp 语言基础语法上稍加修改,我们一般称之为 Lisp 方言。

Clojure 就是这么一种 Lisp 方言。这个语言依托于 JVM 生态,可以将 Lisp 风格的代码编译成字节码在 JVM 上运行。这样设计,就可以让 Clojure 可以比较方便地调用 Java 生态下的库和函数,方便开发者开发复杂的项目。

从结果上来看,Clojure 这种“背靠大树好乘凉”的策略是成功的。在目前所有 Lisp 方言中,可以说目前 Clojure 的生态是相当不错的,社区也很活跃。

Clojure官网介绍


Clojure 的 web 生态

既然背靠 JVM,一个绕不开的话题就是 web 后端服务。这是我们这个专栏后续会主要关注的方面。

实际上,从我目前的学习体验来看,Clojure 是非常适合用于 web 后端开发的。

Clojure 本身的函数式特性使得网络请求处理的生命周期清晰明确;宏和元编程赋予了 Clojure 无与伦比的表达能力,可以用很少的代码就完成复杂的业务需求;基于 REPL 的开发模式大大提高了开发效率;由于背靠 JVM,即便出现了某个冷门库缺失的情况,也可以轻松调用 Java 生态的库来解决。

不同于在 Java 内具备统治性地位的 Spring 全家桶系列,Clojure 语言没有一个大而全的后端框架,而是有一系列松散的库的合集。

Clojure 生态似乎比较排斥“框架”的概念,很多人都觉得框架太重了,而“库”这个体量刚刚好。

实际上,Clojure 的后端生态由围绕在 Ring 这个基本库构建的一系列互相配合的库构成。既然被称为库,绝大部分库的核心代码行数往往就在 1k~10k 这个水平,每个库各司其职,需要开发者掌握的接口数量一般都很少。

Clojure web生态核心:Ring库

不少库甚至不需要一个专门的文档网站,只需要读完一个不长的 README 文件就掌握了全部核心技巧了。

所以,尽管 Clojure 的 web 生态看上去要学很多东西,但实际上只需要掌握几个核心库就可以启动项目了,其他库可以根据需要渐进式添加。

在本专栏后续的文章中,我们会首先简要讲解 Clojure 语言的基本特性,然后深入介绍围绕 Ring 的各个 Clojure 后端库。


关于环境配置

作为专栏第一篇写 Clojure 的文章,我自然要稍微提一下 Clojure 的环境配置问题。

Clojure 目前主流的项目管理方案有两个:一个是比较老的 leiningen 工具,另一个是更新一点的 Clojure CLI + deps.edn。

如果你之前从来没有接触过 Clojure,我强烈建议从入门时就使用更新一些的 Clojure CLI 作为主要练习的工具,这是目前社区的主流。

安装 Clojure CLI 的步骤很简单,参照官网上说的操作流程即可。

对于 Windows(非 wsl)用户而言,官网上建议的是用一个由社区维护的 msi 安装包,但我个人倒是更建议使用如下方式配置好 scoop,这样就可以使用 scoop 进行方便的包管理和更新了。

scoop bucket add java
scoop bucket add scoop-clojure https://github.com/littleli/scoop-clojure
scoop install temurin-lts-jdk clj-deps leiningen

这里我们安装了开源的 JDK 实现 temurin JDK 的长期维护版。此外,cljs-deps 涵盖了 Clojure CLI 以及一些其他可能需要的周边工具,以及旧项目可能需要的 leiningen。

安装完后,执行clj命令,看到如下结果:

Clojure CLI成功安装

到这里,就算环境配置成功了。

专栏的下一篇文章,我打算接着聊如何配置 VSCode,使其能够完美实现 REPL 驱动的开发模式,显著提高开发效率;并尝试开始讲 Clojure 的基本语法。

点击阅读下一篇文章

已复制! 复制代码到剪贴板