← 返回信息流
AI 资讯Hacker News·10 小时前

Rhombus:用传统语法实现灵活元编程

原标题:Flexible metaprogramming with Rhombus

速览

Rhombus 是 Racket 的新编程语言版本,旨在将 Lisp 系列在元编程领域的领先优势与现代语言的简洁语法相结合。它采用传统非括号语法,同时保留了强大的编译时元编程能力,包括宏扩展和语法自定义。 该语言在保持实用性的同时,解决了 Lisp 因括号过多而导致的入门障碍,也让现代编程语言难以实现的元编程变得易于使用。 其意义在于为软件开发提供更灵活的工具,特别适合需要定制语言或 DSL 的场景,有望提升开发效率和创新能力。

AI 深度解读

背景

Rhombus 是一门旨在融合 Lisp 系语言强大元编程能力与 Python 般简单语法的新编程语言。它属于 Racket 项目生态的一部分,由 Matthew Flatt(犹他大学)和 Wing Hei Chan(香港中文大学)共同开发。Rhombus 最初作为教学工具在两位创作者的母校使用,但已扩展到支持现实世界的专业应用,并于 2024 年 6 月 22 日完成 1.0 版本发布。核心语言采用 MIT 或 Apache 2.0 许可,构建于 Racket 运行时之上,因此可直接复用 Racket 的海量库和优化编译器。Rhombus 提供解释、字节码或本地机器码三种执行模式,与 Racket 相比,其默认数据结构改为树结构支持对数时间复杂度的操作,并通过语法(缩进制 + “:” 块分隔 + “|” 分支符号)实现更接近 Python 的可读性。

核心内容

Rhombus 的语法采用基于缩进的风格,块由冒号(:)开始。条件表达式(如 if)使用 “|” 分隔分支,例如:

fun factorial(n):
  if n <= 1 | 1 | n * factorial(n - 1)

相比传统 Lisp 的嵌套括号,Rhombus 风格更简洁,同时保留了 Lisp 的灵活性。默认变量为不可变(immutable),需显式使用 def mutable 声明可变绑定。Rhombus 还引入了 for 循环的“reducer”特性(Lisp 系语言中少见),可用于将循环结果聚合为最终值。例如,使用 math.product reducer 可将列表中元素相乘:

fun factorial(n):
  for math.product (i in 1..=n): i

inclusive range 1..=n 取代了传统 1..n 的 exclusive range。Rhombus 的 for 循环支持通过 reducer 直接生成列表(List)、集合(Set)、映射(Map)或布尔值(all / any),使之成为其他语言中列表推导的等价形式。

元编程部分是 Rhombus 的核心优势。使用单引号(')创建 syntax objects,它作为独立数据类型携带行号、位置等元数据,从而生成带栈追踪的友好错误信息。$ 符号用于占位符,import: rhombus/meta 可引入宏定义工具。Rhombus 支持 hygienic(卫生)和 non-hygienic(非卫生)宏,卫生宏默认启用。宏可定义在任何函数可出现的语法上下文中,包括表达式、导入、模式匹配等,并通过 reducer.macro 等变体支持自定义 reducer。

以下代码展示了如何实现 Ruby 风格的后缀 if(postfix if):

import: rhombus/meta open
expr.macro '$action if $test':
  'when $test | $action'

此宏仅需在表达式位置使用即可。Rhombus 还允许用户自定义语法上下文函数,自由扩展语言本身。

类型系统支持渐进类型注解(gradual type system),如 fun factorial(n :: Int) :: Int:。注解可作为静态信息附加到任意表达式,并由宏访问以指导类型推断、错误提示或代码优化。Rhombus 不强制静态类型,但可通过注解实现类似静态检查的效果。语言整体暴露自身实现细节,符合语言导向编程(language-oriented programming)理念:对于多数日常任务,内置工具即可满足;对于特定需求,宏与注解可快速定制。

关键要点

  • Rhombus 语法高度 Python 化:缩进 + “:” 块 + “|” 分支,远优于 Lisp 的括号地狱。
  • 数据结构默认使用不可变树,支持对数时间操作,内置数组、映射、集合等标准库。
  • for 循环内置 reducer(如 math.productListall)实现列表推导等功能,无需外部库。
  • 元编程采用独立 syntax object 数据类型,保留元数据并支持 hygiene,默认卫生宏;宏可定义于任何语法上下文。
  • 类型系统渐进式:注解可推断类型、生成错误提示、优化编译,但可扩展为任意静态信息系统。
  • 语言设计暴露自身实现细节,支持用户自定义语法与上下文,符合语言导向编程。

意义与影响

Rhombus 填补了 Lisp 系元编程能力与现代语言易用性之间的空白:它让宏编程不再局限于学术或极客圈,而是可嵌入日常代码,同时保持 Python 般的可读性。这一设计使 Rhombus 成为兼具教学工具与专业应用潜力的语言,已有经济游戏部分代码、学术研究之外的实际项目在使用。相比 Racket 纯 Lisp 风格,Rhombus 的语法更易上手,树结构数据结构解决了列表的性能瓶颈,而语法对象+宏的元编程机制保留了 Lisp 的强大控制力。开发支持来自 Racket 编程语言基金会,未来或将进一步完善其生态,成为 Python 之外的另一强大元编程选择。对于希望在生产环境中使用宏编程、需要友好错误提示或渐进类型系统的开发者,Rhombus 提供了可扩展的框架;对教育者而言,它仍是理想的教学语言。整体而言,Rhombus 代表了现代语言设计从“简单语法”向“极致灵活性”演进的新方向,值得开发者关注。

查看原文 →lwn.net