Clojure 是运行在 JVM 之上的现代 Lisp 方言,以不可变数据结构、纯函数优先和强大的并发抽象(STM、Agent、core.async)闻名。它既保留了 Lisp 的表达力,又完整拥抱了 Java 生态。从金融系统中的高频交易引擎到数据密集型 Web 服务,Clojure 证明函数式编程在工业级环境中同样强大可靠。
一、入门与基础
基础语法与概念
理解 Clojure 的 S-表达式、前缀记法和不可变数据模型:
- Clojure 基础语法 — 命名空间、函数定义、特殊形式(def/defn/let/if/cond)、数据结构(vector/map/set/list)、尾递归优化与线程宏基础
- Clojure 学习计划 — 分阶段学习路线图:环境搭建(Leiningen/Clojure CLI)、基础语法、函数式编程、并发模型、Java 互操作、Web 开发、进阶专题
REPL 驱动开发与实例教程
- Clojure 基础教程 — 从函数式编程核心概念出发,深入理解多方法(Multimethod)、STM 软件事务内存、Agent 并发模型,并通过 Ring/Compojure 构建 Web 服务
- Learn Clojure by Examples — REPL 驱动开发实践、Java 互操作入门、STM 并发初探、clojure.spec 数据验证基础
- Clojure REPL 驱动开发 — nREPL 协议与连接、Clojure CLI / Leiningen 启动、CIDER/Calva 编辑器集成、热重载与代码演化(:reload/reset!)、远程与嵌入式 REPL、REPL 测试调试与纪律
二、数据操作与处理
序列变换与高阶函数
Clojure 的序列库是函数式数据处理的核心能力:
- Clojure 数据操作 — 懒加载序列(Lazy Sequences)、map/filter/reduce 高阶函数、序列转换(seq/vec/list)、无限序列与 chunking、transducers 基础
- Clojure Transducers 深度解析 — 转导器组合与 transduce/into/sequence/eduction 四大入口、状态化转导器(partition-all/take-while)、自定义 xform 与早停(reduced)、与惰性序列性能对比
- Clojure 持久化数据结构 — 结构共享(分支 32 树 / HAMT)、transient 批量构建与纪律、时空复杂度对比、结构选型与性能陷阱、事件溯源实战
- JSON/EDN 序列化与数据格式互操作 — EDN 与 JSON 语义差异(关键字/符号/集合/数字精度)、cheshire 与 jsonista 性能对比、自定义编码器与命名风格转换、Transit 跨语言传输、Nippy 二进制序列化、大文档流式解析与安全反序列化
序列操作的函数式思想与 Rust 的 Iterator trait、Java 的 Stream API 一脉相承。可参考 Rust 基础知识 和 Java 快速入门 作为横向对比。
数据科学与数值计算
Clojure 用不可变数据 + ->> 线程宏写数据管道,天然可复现:
- Clojure 数据科学与数值计算 — tablecloth 数据框操作与 pipeline 清洗、tech.ml.dataset 底层抽象、统计分析与相关性、hanami/Vega-Lite 声明式可视化、tech.ml 机器学习建模与评估、libpython-clj 互操作、数据科学工程化(可复现性/生产边界)
数据管道与流处理
- Clojure 数据管道与流处理 — Kafka 生产消费与消费组管理、core.async 异步管道与有界缓冲背压、ETL 清洗转换加载、批处理与增量窗口聚合、Exactly-Once 与幂等消费、管道可观测性与故障恢复
三、元编程与语言扩展
宏系统与 DSL 构建
宏是 Clojure 最强大的语言特性,它让「代码即数据」从理论变为工程实践:
- Clojure 宏编程深度解析 — quote/unquote/unquote-splicing 语法、syntax-quote 模式匹配与 hygienic macro 原理、自定义控制流宏(with-resource/timed)、SQL 查询 DSL 与状态机 DSL 构建、线程宏(->/-»/as->/cond->)详解、宏与函数的设计选型
;; 宏的简洁威力:语法糖构建
(-> data
(assoc :key "value")
(update :count inc))
;; 展开后:
(update (assoc data :key "value") :count inc)
- 解析与 DSL:Instaparse 与解析器组合子 — Instaparse 的 EBNF 语法与解析树、CFG/PEG 两种模式与歧义处理、解析器组合子手写递归下降、错误定位与语法可视化调试、把 AST 解释/编译为可执行表达式的完整链路
函数式设计模式
OO 设计模式在 Clojure 里退化为高阶函数与「数据 + 求值器」:
- Clojure 函数式设计模式 — 策略与模板方法退化为高阶函数、命令与解释器退化为「数据 + 求值器」、观察者退化为 watch 与通道、责任链与状态机的函数式实现、组合子模式的领域语言威力
错误处理与组合子
- Clojure 函数式错误处理 — 异常(ex-info/ex-data)与 Result/Either 值化错误的权衡、»= 短路链组合子、错误边界与中间件统一兜底、spec 拦截非法输入、恢复重试与错误可观测性
四、多态与类型系统
多方法与协议
Clojure 摒弃了传统面向对象的类继承,转而采用更灵活的 ad-hoc 多态:
- Clojure 多方法与协议 — 基于任意函数的动态分派(defmulti/defmethod)、协议定义与类型扩展(defprotocol/extend-type/extend-protocol)、Record 实现协议、层级继承与持续化、多租户权限系统实战案例
| 机制 | 分派依据 | 适用场景 |
|---|---|---|
| Protocol | 第一个参数的类型 | 结构化接口、高性能调用 |
| Multimethod | 任意函数返回值 | 灵活分派、多重条件匹配 |
| Hierarchy | derive 关系 | 类型分类与继承匹配 |
五、JVM 互操作与性能优化
调用 Java 生态系统
Clojure 无缝复用整个 Java 生态,从标准库到企业框架:
- Clojure 调用 Java 深度实践 — 对象创建与方法调用(new/.method/.field)、proxy/reify/gen-class 实现接口、静态成员访问、type hinting 与反射优化、primitive array(amap/areduce)、deftype 高性能类型、ExecutorService/CompletableFuture 并发集成、Gradle/Leiningen 混合项目、Spring Boot 嵌入 Clojure
- Clojure 性能优化与 GraalVM 原生编译 — 类型提示消除反射、primitive 参数与数组(long-array/amap/areduce)、transient 临时可变数据结构、criterium 精确基准测试、direct-linking 优化、GraalVM native-image 编译与反射配置、启动性能对比
- JVM 调优与容器化部署:GC、JFR 与 Docker — 堆结构与 GC 选型(G1/ZGC/Shenandoah)与关键 JVM 参数、JFR + JMC 诊断方法热点与分配、容器内存与 CPU 感知(MaxRAMPercentage)、Dockerfile 分层构建与 Kubernetes 资源配置、健康探针与优雅停机
性能优化关键
| 技术 | 收益 | 代码示例 |
|---|---|---|
| Type Hinting | 消除反射,10-100x 提速 | ^long n, ^String s |
| Primitive Array | 避免装箱开销 | int-array, amap, areduce |
| Direct Linking | 跳过 var 动态查找 | -Dclojure.compiler.direct-linking=true |
| deftype | 与 Java 类同等性能 | (deftype Point [^double x ^double y]) |
六、工具链与项目管理
Leiningen vs Clojure CLI
Clojure 生态的两个构建工具各有优势:
- Clojure 工具链演进 — Leiningen(project.clj)与 Clojure CLI / deps.edn(纯数据 EDN)深度对比、tools.build 官方构建脚本、uberjar/native-image 打包、GraalVM 编译、Emacs/CIDER / VS Code/Calva / IntelliJ/Cursive IDE 配置与快捷键
# 新项目推荐
clojure -Tnew create :name myapp
clojure -M:dev # 启动带 dev 别名的 REPL
clojure -T:build uber # 构建 uberjar
REPL 驱动开发工作流
| IDE | 启动 REPL | 求值表达式 | 代码重载 |
|---|---|---|---|
| Emacs + CIDER | C-c M-j | C-c C-e | C-c C-k |
| VS Code + Calva | Ctrl+Alt+C J | Ctrl+Enter | Calva: Load File |
| IntelliJ + Cursive | Tools → REPL → Start | Ctrl+Shift+P | Tools → REPL → Sync |
七、数据验证与测试
spec 属性驱动测试
- Clojure spec 与测试 — spec 定义与符合性检查(s/def、s/valid?、s/conform)、and/or/tuple/coll-of 组合 spec、函数规格 fdef、test.check 生成器与属性驱动测试、API 请求参数校验实战、Malli 现代替代方案
- Clojure 生成式测试实战 — test.check 生成器组合(gen/fmap/bind/sized)、随机测试与种子复现、收缩(shrinking)机制、与 spec 的 s/gen + s/fdef + instrument 集成、CI 中的属性测试策略
- Clojure 测试与质量工程 — clojure.test / kaocha / expectations 测试框架选型、REPL 驱动测试工作流、测试替身与依赖注入(with-redefs)、Testcontainers 真实环境集成测试、cloverage 覆盖率与质量门禁、CI 流水线集成、测试金字塔落地
Clojure 的测试哲学强调属性而非示例——用生成器自动生成边界数据,验证函数的数学属性(如 reverse ∘ reverse = id),而非仅靠手写的几个测试用例。
八、Web 全栈开发
Ring + reitit 现代 Web 栈
- Clojure 现代 Web 全栈开发 — Ring 请求/响应抽象与 middleware 链、reitit 数据驱动路由与 coercion、muuntaja 内容协商(JSON/EDN)、next.jdbc + HikariCP 数据库访问、完整 RESTful CRUD 服务代码、健康检查与 metrics、Docker 容器化与 uberjar 部署
- Clojure 数据库访问实战 — next.jdbc 连接与参数化查询、事务与隔离级别、HoneySQL 数据驱动 SQL 生成、HugSQL、HikariCP 连接池调优与监控、Migratus 数据库迁移
- ClojureScript 全栈开发 — reagent 函数式 React 组件与 Hiccup、re-frame 事件循环与 effects/coeffects 副作用建模、CLJS 与后端 API 通信、shadow-cljs 构建与 CLJC 代码共享
- Clojure REST API 设计实战 — reitit 数据驱动路由与 coercion(Malli 校验)、资源建模与幂等、结构化错误码、cursor 分页与过滤白名单、JWT 鉴权与角色授权、版本化策略、OpenAPI 文档生成与契约测试
- Clojure GraphQL API 实战 — lacinia Schema 定义、两层 resolver、N+1 批处理(batch/DataLoader)、变更事务与幂等、context 注入权限、订阅实时推送、深度/复杂度/条数三限制
Clojure Web 框架对比
| 框架 | 路由方式 | 核心特性 | 适用场景 |
|---|---|---|---|
| Ring + reitit | 数据驱动 | 高性能 Trie 匹配 | 标准 RESTful API |
| Pedestal | 拦截器 | 异步处理、流式数据 | 高并发微服务 |
| Luminus | 模板集合 | 开箱即用 | 快速项目启动 |
网络服务与微服务架构
Web 栈之外的网络能力与分布式工程:
- Clojure 网络服务深入 — clj-http 同步调用与 http-kit 异步高并发、WebSocket 双向通信与连接管理、SSE 服务端推送、gRPC 跨语言集成、超时/重试/连接池/背压的工程化处理
- Clojure 微服务架构实战 — 服务拆分原则、服务发现与注册(Consul / etcd / K8s Service)、reitit API 网关与 BFF、配置管理与环境隔离、可观测性三支柱(日志/指标/追踪)、容器化与 K8s 部署、Saga 分布式事务与最终一致
- Clojure 桌面 UI:cljfx 与 JavaFX 实战 — cljfx 声明式 UI 与状态驱动模型、JavaFX 控件与布局、fx/sub-val 响应式订阅、事件处理与副作用、CSS 样式、jpackage 打包为原生安装包与 GraalVM native image 可行性分析
九、并发与并行
Clojure 并发工具箱
- Software Transaction Memory(STM):基于
ref/dosync的协调式状态修改 - Agent:异步队列化的状态更新,错误自动缓存
- core.async:CSP 风格的通道与 go-block,实现 Go 语言式的并发原语
- pmap/pvalues:并行集合处理
;; STM 示例:无锁并发
(def account-balance (ref 1000))
(dosync
(alter account-balance + 500))
;; core.async 示例:通道通信
(require '[clojure.core.async :as async])
(def ch (async/chan 10))
(async/go
(async/>! ch "消息"))
(async/go
(println (async/<! ch)))
- Clojure 并发设计模式 — STM 软件事务内存(ref/dosync/alter/commute)事务一致性保证、core.async CSP 通道与 go-block 异步编排、Agent 异步队列更新模型、生产者-消费者模式、管道流水线、背压控制与超时策略
- Clojure core.async 深入 — 通道模型与缓冲策略(unbuffered/dropping/sliding)、go-block 状态机与 thread 隔离、有界缓冲形成天然背压、alts! 多路选择与 timeout、错误跨通道值化、pipeline 并行流水线、死锁与泄漏排查
领域建模与事件溯源
DDD 聚合与事件溯源
- Clojure 领域建模与事件溯源 — DDD 限界上下文与聚合根、事件溯源 decide/evolve 纯函数建模、事件存储与投影、CQRS 命令查询分离、与 spec 集成与事件版本化、完整银行账户实战
十、脚本化、数据查询与工程化
从脚本自动化到数据查询、从代码质量到可观测性与安全:
- Babashka 脚本化与任务自动化 — 原生镜像原理与毫秒级启动、bb 任务与脚本组织、内置库与 pods、文件/HTTP/进程操作、CI 与本地自动化、与 JVM Clojure 的边界取舍
- Datalog 查询与 Datomic/Xtdb — 数据即事实的建模、query 与 pull 拉取、规则与递归、时间旅行与 as-of 查询、Xtdb 架构与事务、与 SQL/ORM 的取舍
- 静态检查与格式化工具链 — clj-kondo 规则与自定义 hook、cljfmt/zprint 格式化、CI 集成与增量检查、常见告警治理、编辑器与 LSP 协同
- 日志、指标与可观测性 — Timbre 结构化日志、上下文与 MDC 传递、OpenTelemetry 埋点与 trace 传播、指标导出、错误上报与采样策略
- 认证授权与安全实践 — Ring 安全中间件链、Session/JWT 与会话管理、密码哈希与密钥管理、CSRF/XSS/SQL 注入防护、权限模型与审计日志
- Kafka 事件流集成 — Jackdaw 客户端、生产与消费、序列化与 Schema 演进、消费位移与错误处理、与 core.async 编排、生产运维要点
- 组件与依赖注入:Component、Integrant 与 Mount — Component 协议驱动生命周期(defrecord + Lifecycle)、Integrant 数据驱动配置与合并机制、Mount REPL 友好状态管理、依赖顺序与启动关闭钩子、测试隔离与三种方案选型矩阵
- 缓存策略:core.cache、Caffeine 与失效设计 — core.cache 的 TTL/LRU/LFU 与 defcache 宏、Caffeine W-TinyLFU 与异步加载、Redis 分布式缓存、单飞(single-flight)并发回源、击穿/穿透/雪崩防护与失效设计
十一、实时通信、AI 集成与工程迁移
从 WebSocket 实时通信到大模型集成,从 Java 迁移路径到配置与密钥治理:
- Clojure 实时通信与 Sente — Sente 协议与传输回退、事件路由与握手、多节点广播与适配器、断线重连与状态恢复、鉴权与限流
- 从 Java 迁移到 Clojure — 渐进迁移策略与边界划分、互操作与适配层、可变状态改造、团队协作与代码评审、测试与回滚
- 数据校验:spec 与 Malli 对比 — 声明式约束与语义差异、错误信息与人类可读性、生成式测试联动、性能与运行时开销、渐进式校验落地
- Clojure 集成大语言模型 — LLM 客户端封装与流式响应、Prompt 与上下文组织、工具调用与 Agent 编排、成本与超时控制、评测与降级
- Clojure 报表与文档生成 — 模板引擎选型与渲染、Excel/PDF/HTML 产物生成、大数据量流式写出、样式与分页控制、定时与分发
- Clojure 配置与密钥管理 — 分层配置与环境覆盖、aero/Integrant 集成、密钥注入与轮换、敏感信息脱敏、启动期校验与快速失败
十二、关联专题
| 专题 | 关联内容 |
|---|---|
| Java 专题 | JVM 基础、Java 类库调用 |
| Rust 专题 | 函数式编程思想对比、不可变数据 |
| Erlang 专题 | 并发模型对比(Actor vs STM) |
| PostgreSQL 专题 | next.jdbc 与数据库集成 |
| Docker 专题 | Clojure 容器化部署 |
| GitHub Actions 专题 | Clojure 项目的 CI/CD 流水线 |