使用 Clojure 大约一个月后的想法
函数式 vs OOP 以及 Clojure 的设计
- 几位评论者都从 OOP 背景出发,最初觉得函数式范式不太舒服,但对大型系统而言又越来越有吸引力。
- 有人认为 Clojure 通过 map/record、protocol、multimethod 和 schema 提供了“一种可按需选择的 OOP”,但也有人觉得这比传统类层次结构更像是临时拼凑的方案。
- 也有人主张,优秀的 OOP 和 FP 在实践中会趋同,而普遍的不可变性加上简单的数据转换,会让大规模设计和重构更容易。
语法、括号与编辑体验
- 对 Clojure 语法的看法不一:有人称之为“括号地狱”,也有人认为向量/集合/映射以及更简洁的核心语法,相比其他 Lisp 是整体进步。
- 结构化编辑工具(paredit、parinfer、Emacs 的 sexp 导航、Ki 编辑器、基于缩进的移动)被反复提及,被认为对于管理括号和让重构变得愉快至关重要。
- 关于某些具体语法选择也存在争论,例如
let绑定使用向量,以及其他 Lisp 中 list 与 vector 的不同遍历方式。
运行时、并发与“语法 vs 运行时”
- 一个重要讨论认为,对于真实世界系统来说,运行时特性(绿色线程、actor、STM、不可变性)比语法更重要。
- 有些人强烈偏好 Erlang/Elixir 或 Go 的运行时,因为它们适合海量轻量 actor 和无共享设计。
- 也有人反驳说,JVM 是最先进的运行时之一,如今已有虚拟线程、强大的并发能力,以及 Akka 之类的库;认为它“落后”的说法已经过时。
- STM 和 JVM 上的 actor 也被承认存在,但被认为不如 BEAM 的内建模型那样惯用,或使用范围没有那么广。
LLM、Clojure 与 REPL
- 基准测试显示,原始 LLM 在 Clojure 上的“一次成功率”较低(语法、括号、求值顺序等方面),但当接入 Clojure REPL 后,它们可以迭代测试代码,效果会好得多。
- REPL 驱动开发被描述为一种超能力,对人类和 LLM 代理都一样;它能支持渐进式探索、调试和库发现。
类型、Spec 与可靠性
- 一些评论者对动态类型感到吃力,报告了细微的运行时 bug,以及他们在类型化 FP 语言中能获得但这里缺失的编译期保证。
- 另一些人则为 Clojure 有意保持的动态性辩护,并建议依赖 REPL 加上 schema/spec(例如 Malli、spec、研究/有限使用中的 Typed Clojure)来做部分静态检查和数据校验。
- 有一种强烈观点认为动态类型总是错误的;也有人不同意,并强调权衡与生产力。
可移植性与生态
- Clojure 被强调为一种托管语言,拥有许多方言(JVM、JS、CLR、Dart、babashka、C++、Python-hosted 等)。
- 一个共享的 clojure.core 测试套件正在被用于衡量并改进跨方言兼容性。
- 这种可移植性被视为重大优势:大量“纯” Clojure 代码可以在不同运行时之间不加修改地运行。
工作、流行度与经济性
- 有人指出 Clojure 的职位发布相对较少,并将其视为市场吸引力不足。
- 也有人回应说,Clojure 相关岗位通常薪资高于平均水平,反映的是非商品化招聘;流行度和职位数量并不直接等同于技术优劣。
- 讨论还区分了“协同效应”和政治因素(例如 Python、JS、C#、PHP 的采用)与语言质量。
静态站点生成器与 Lisp 小玩具
- 多位评论者提到,自己用 Clojure 或其他 Lisp 编写静态站点生成器,这几乎像是一种成人礼。
- 自制 SSG 很有趣,也容易用宏/模板扩展,但在优化、CSS 处理、SSR 和 Node 生态集成方面不如成熟工具;许多人最终会迁移到主流 SSG。