一句话:提出 Rhombus:在 Racket 上用中缀语法实现 Lisp 式宏与语言扩展的多绑定空间方案。
Rhombus 是构建在 Racket 上的新语言,目标是在传统中缀表示法下提供与 Racket 同等的语言可扩展性,同时避免 Lisp 式宏所依赖的大量括号。其关键方法是引入多个绑定空间,支持上下文相关的子语言,使表达式与模式匹配等上下文可复用同名但含义不同的运算符而不冲突。上下文敏感绑定还缩短了核心语言与宏设施之间的记法距离,例如重复可在绑定与表达式上下文中通用定义和使用,从而平滑过渡到元编程。此外,扩展协议支持在绑定与表达式之间传递静态信息(如类型),以将宏扩展到 Lisp 之外。实现表明这些机制能协同工作,形成连贯且用户友好的语言。
Rhombus is a new language that is built on Racket. It offers the same kind of language extensibility as Racket itself, but using traditional (infix) notation. Although Rhombus is far from the first language to support Lisp-style macros without Lisp-style parentheses, Rhombus offers a novel synthesis of macro technology that is practical and expressive. A key element is the use of multiple binding spaces for context-specific sublanguages. For example, expressions and pattern-matching forms can use the same operators with different meanings and without creating conflicts. Context-sensitive bindings, in turn, facilitate a language design that reduces the notational distance between the core language and macro facilities. For example, repetitions can be defined and used in binding and expression contexts generally, which enables a smoother transition from programming to metaprogramming. Finally, since handling static information (such as types) is also a necessary part of growing macros beyond Lisp, Rhombus includes support in its expansion protocol for communicating static information among bindings and expressions. The Rhombus implementation demonstrates that all of these pieces can work together in a coherent and user-friendly language.
@article{paperbot1839,
title = {Rhombus: A New Spin on Macros without All the Parentheses},
author = {Matthew Flatt and Taylor Allred and Nia Angle and Stephen De Gabrielle and Robert Bruce Findler and Jack Firth and Kiran Gopinathan and Ben Greenman and Siddhartha Kasivajhula and Alex Knauth and Jay McCarthy and Sam Phillips and Sorawee Porncharoenwase and Jens Axel Søgaard and Sam Tobin-Hochstadt},
journal = {Proceedings of the ACM on Programming Languages},
volume = {7},
number = {OOPSLA2},
year = {2023},
doi = {10.1145/3622818}
}