GitHub 上有个小项目叫 rust-but-lisp,命令行工具名是 rlisp。它做的事很直白:用 Lisp 风格的 S 表达式写 Rust,再生成 .rs 文件,最后交给 rustc 编译成二进制。
页面信息也很克制:约 16 个 star、0 个 fork、16 次 commit。它不是一个已经成气候的新生态。它有意思的地方在于,把一个老问题摆到台面上:Rust 难,到底难在花括号,还是难在所有权、借用和类型系统?
我的判断很简单:rlisp 不是“新 Rust”,也不是 Rust 官方方言。它更像一个 Rust 的 S 表达式语法前端。
它做了什么:把 s-expr 送进 rustc
项目 README 对自己的定位是:Rust semantics with LISP syntax。这个说法很关键。
rlisp 的编译链路是:s-expr → .rs → binary。也就是说,开发者写的是 Lisp 风格代码,工具先把它转成 Rust 源码,再交给 rustc。
真正负责类型检查、借用检查和优化的,还是 rustc。rlisp 不接管 Rust 的语义,也没有绕过 borrow checker。
可以把它拆成四层看:
| 问题 | rlisp 的做法 | 判断 |
|---|---|---|
| 写法 | 用 S 表达式描述 Rust 代码 | 主要变化在语法层 |
| 语义 | 沿用 ownership、borrowing、lifetimes | 不是新语义体系 |
| 编译 | 生成 .rs,再交给 rustc | 依赖 Rust 官方工具链 |
| 运行时 | README 写明 no runtime、no GC、no semantic gap | 不改变 Rust 运行模型 |
这张表也解释了它为什么容易被误读。
看起来像 Lisp,不等于它有一套 Lisp 运行时。写法变了,Rust 那套规则还在。借用不合法,照样过不了。类型推不出来,也不会因为括号换了形状就变简单。
对 Rust 开发者来说,最现实的动作不是“要不要换语言”,而是“要不要把它当成语法实验读一遍”。如果团队正在写生产服务,不建议把核心代码迁进去。多一层转译,就多一层审查、调试和维护成本。
它覆盖不少 Rust 写法,但边界也很硬
从 README 示例看,rlisp 覆盖的范围不只是 hello world。示例包括 struct、impl、match、loop、closure、module、macro、inline Rust。
README 还列出泛型、trait、模式匹配、可见性、use、const、方法调用、数组索引等语法映射。至少从目标上看,它想表达一大块常用 Rust,而不是只做演示玩具。
但这里要分清“能映射”和“适合工程使用”。
能把 struct、impl、match 写成 S 表达式,说明前端设计有一定完整度。可工程里真正麻烦的,往往不是语法能不能表示,而是报错能不能看懂、生成代码能不能审查、IDE 能不能跟上。
这也是 rlisp 当前最硬的边界:README 强调 no runtime、no GC、no semantic gap。优点是薄,缺点也是薄。
薄的好处,是你不用信任一个新编译器。rustc 还在那里,Rust 的检查和优化还在那里。
薄的代价,是一旦错误落在生成后的 Rust 代码里,开发者可能要在 rlisp 源码和 .rs 输出之间来回对照。源码映射、错误定位、格式化、补全、重构,这些都不是一句“生成 Rust”就自动解决的。
macro 也要谨慎看。rlisp 说的是 S 表达式层面的编译期转换,宏是从 s-expression 到 s-expression 的函数。这不能直接等同于 Rust proc_macro,也不是 syn、quote、token stream 那套生态的替代品。
这类项目的看点,不在“它终于把 Rust 变成 Lisp 了”。更准确地说,它在测试一件事:如果不改 Rust 语义,只换一种表层语法,开发体验会变多少。
谁该看,谁该先等等
最该看的有两类人。
一类是 Lisp / S 表达式爱好者。他们可以用 rlisp 理解 Rust 的所有权、借用、泛型和 trait。好处是表层语法更熟悉,坏处是 Rust 真正难的部分并不会消失。
另一类是 Rust 工具链和语言前端玩家。rlisp 是一个小样本:不自建运行时,不自建类型系统,只做语法层转换。这个样本干净,适合研究“前端能改变多少体验”。
对业务团队,建议更保守。
如果只是内部小工具、教学实验、语法探索,可以试。成本可控,出问题也容易回退。
如果是多人协作的核心服务,先不要迁移。代码审查会从“看 Rust”变成“看会生成 Rust 的 Lisp 风格代码”。新人培训、CI、错误排查、IDE 支持,都会多一层摩擦。
接下来最该看三件事,不是 star 涨不涨:
| 观察点 | 为什么重要 | 目前应怎么判断 |
|---|---|---|
| 生成的 .rs 是否稳定可读 | 影响代码审查和回退 | 没有证据前,不宜假设成熟 |
| 错误信息能否映射回 rlisp 源文件 | 影响日常调试 | 这是采用门槛,不是锦上添花 |
| macro 在复杂工程里是否可维护 | 影响长期协作 | 不能直接套用 Rust proc_macro 的预期 |
所以,rlisp 的合理位置不是生产替代品,而是语法前端实验。
它让人重新看见一个事实:Rust 的门槛不只在写法。括号可以换,所有权还在;语法可以变,rustc 的规矩还在。
这也是它最清醒的地方。没有运行时,没有 GC,没有语义差。它不冒充另一门 Rust。
也正因为如此,它的天花板现在看得很清楚:要从有趣走向可用,必须解决调试、映射和协作成本。否则,它会停在一个聪明的小前端,而不是一条新的 Rust 路线。
