← На главную

Вышел Rhombus 1.0 — Python с макросами Racket

02.07.2026 15:43 · hackernews

Rhombus — новый язык программирования, который соединяет мощь метапрограммирования из Racket с простым синтаксисом в стиле Python и разумными настройками стандартной библиотеки. Это часть большого проекта Racket, который, по словам авторов, «укоренён в академии». Из 43 контрибьюторов двое самых активных — Мэттью Флатт из Университета Юты и Винг Хей Чан из Китайского университета Гонконга (Чан работает над Rhombus независимо, не входит в компьютерный факультет). Язык уже вышел в версии 1.0 22 июня 2026 года и используется не только в университетах: например, частично на нём написан набор инструментов для карточной игры Economancy.

Ядро Rhombus распространяется под лицензиями MIT или Apache 2.0, но поверх рантайма Racket, который включает LGPL 3.0 в некоторых динамических библиотеках. Благодаря повторному использованию инфраструктуры Racket, у языка уже много готовых библиотек и оптимизирующий компилятор. Программы можно интерпретировать, компилировать в байткод или в нативный машинный код.

Синтаксис основан на отступах, как в Python, и использует двоеточие для начала блока. Ветвления в if отделяются символом «|». Вот пример факториала:

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

По умолчанию переменные неизменяемы — нужен mutable. Циклы for поддерживают редкую для языков за пределами Lisp фичу — «редьюсер»: например, math.product собирает произведение всех значений цикла.

Макросы работают с синтаксическими объектами — особым типом данных, который хранит позицию в коде и информацию об области видимости. Это даёт понятные сообщения об ошибках со стек-трейсами, учитывающими макросы, и позволяет писать как гигиенические, так и негигиенические макросы (по умолчанию гигиенические). Например, так можно реализовать postfix if из Ruby:

import: rhombus/meta open

expr.macro '$action if $test':
  'when $test
   | $action'

println("Hi!") if (foo == bar)

Грамматические контексты для макросов не фиксированы — язык позволяет определять собственные. Например, можно переопределить, как работают аннотации типов. Rhombus не является строго статически типизированным, но можно добавить аннотации, и они будут использоваться для постепенной типизации, ошибок и генерации кода. Никто не мешает прикрепить к программе собственную статическую информацию — например, для отслеживания чувствительных данных.

По производительности Rhombus находится между JavaScript и Ruby — быстрее Ruby, но медленнее C или Rust. Сильные стороны — гибкость и документация. Язык лучше всего подходит для предметных областей, где нужны свои мини-языки: вместо написания полноценного компилятора достаточно написать набор макросов, получив готовую среду с библиотеками, подсветкой, отладкой и редакторскими фишками.

Читать оригинал →