Rhombus 出了 1.1 版本,官网和更新日志都摆得很低调,但这次改动里有一句话值得多看两眼:以后定义一个"注解"(annotation,大致相当于类型标注),不用再直接写宏。
这句话背后是 Rhombus 的老底子。它是 Racket 团队做的新语言,卖点从一开始就是"极度可定制"——你几乎可以自己往语言里加语法。但代价也摆在那儿:想扩展语言,得先会写宏,而宏是 Racket 系里公认最烧脑的部分之一。1.1 这次动的,正是这道门槛。
速读:这次改了什么
- **annot / annot.def**:声明式定义注解类型,不用碰"元阶段"代码(也就是宏本身运行的那一层)。
- as.新增的绑定写法,比原来的
&&更好读,还能遮蔽已经绑定为绑定形式的标识符。 - class.继承的名字改成绑定到对应的父类或接口引用上,写法变了,不只是加了功能。
- space.enforest.作用域处理规则调整,和宏 transformer 处理标识符的方式对齐。
- ffi / pict / slideshow:FFI 加了初始化数组的
new变体;pict 的Pict.rebuilt换了默认行为(留了开关切回旧版);slideshow 加了页面过渡和连续编号。
受益最直接的,是写 DSL、写宏、给自己项目定制语法的这批人——annot 和 annot.def 省掉了一层元编程门槛;写文档、做演示用 pict/slideshow 的用户也能感受到几个小而实的功能增量。
annot 到底解决了什么问题
以前想定义一个注解类型,得直接写一段在编译期运行的宏代码,理解"什么时候展开、什么时候求值"这套心智模型是绕不开的门槛。annot 和 annot.def 把这层包了起来,你写的更像是声明,而不是元编程。
- 结论.这是把"定义你自己的类型语言"这件事,从宏专家的专属能力,往应用开发者那一侧挪了一步。
但别急着说宏这门课可以不学了——annot 省的是"直接手写元阶段代码"这一步,复杂的自定义语法、更深层的 DSL,该学的宏概念还是躲不掉。
class 继承绑定方式的调整、space.enforest 作用域处理的变化,不是单纯的新增功能,而是行为本身变了。
- 风险.依赖旧的继承名字绑定语义、或者依赖旧作用域规则写宏的代码,升级后要重新过一遍,不能当成无痛更新照单全收。
判断:权力下放一级,但接得住的人有多少
Racket 团队有句不成文的口号——"anything we can do, you can do",意思是造语言的能力不该锁在核心团队手里,普通用户也该能参与语言设计。这和"授人以渔"是一个意思,但渔具本身好不好用,决定了这句话是不是空话。annot 之前,渔具就是"手写宏",工具复杂,能用的人自然少。1.1 把渔具简化了一格,这是实打实的进步。
- 结论.这次更新的价值不在功能数量,而在于它把"语言可定制"这件事,从少数宏专家的能力,推向了更普通的应用开发者。
授人以渔的姿态摆出来了,渔具是不是真好用,还得看后面。
但材料里没有基准测试,没有用户量,没有生态数据,采用前景到底怎样,现在只能说不清楚。Discourse、Discord、PR 和 issue 全部开放给社区参与,这是态度层面的延续,不等于治理成熟,也不等于社区规模已经够大——一个小众语言的"开放参与",和一个千万开发者社区的"开放参与",分量完全不是一回事。annot 降的是写代码的门槛,决定 Rhombus 能不能真正被更多人用起来的,还是文档够不够全、工具链够不够顺手、社区能不能撑住新用户的问题。这些,1.1 这份更新日志本身回答不了。
