Автор пишет про Janet — свой любимый язык для побочных проектов. Это диалект Lisp, и он настолько его обожает, что написал целую бесплатную книгу «Janet for Mortals». Вот главные аргументы, почему стоит попробовать.
Janet очень простой. Это императивный язык с функциями высшего порядка, одним пространством имён и блочной областью видимости. В ядре всего восемь инструкций: do, def, var, set, if, while, break, fn. Остальное — макросы. Семантика знакомая, как в JavaScript, только с типами значений и без «вотэповоротностей». Всю стандартную библиотеку можно уместить на одной странице.
Janet легко распространять. Компилятор превращает код в байткод, а затем запаковывает его в .c файл вместе с рантаймом. Из этого получается крошечный нативный бинарник — «hello world» весит меньше мегабайта (784K на aarch64 macOS). Никаких зависимостей, никаких рантаймов для пользователя.
Язык нереально хорош в парсинге текста. Вместо регулярных выражений — parsing expression grammars. Они проще, мощнее и предсказуемее. Ими можно парсить HTML, JSON, бинарные форматы — всё, что угодно.
У Janet лучший DSL для работы с процессами среди высокоуровневых языков. Библиотека sh позволяет писать пайпы и редиректы прямо в коде: ($ find . -name *.janet | say). Это делает Janet достойной заменой Bash.
Язык встраиваемый. Рантайм — это маленькая C-библиотека. Его можно воткнуть куда угодно: в веб-сайты, в статические генераторы, в любой софт, которому нужен скриптинг.
Коллекции бывают изменяемыми и неизменяемыми. Неизменяемые работают по значению (два одинаковых вектора неотличимы), изменяемые — по ссылке.
Макросы — главная фишка. Писать макросы в Janet весело, хотя можно обходиться и без них. Они негигиеничные, но зато позволяют передавать функции буквально, сохраняя прозрачность ссылок.
Самая крутая особенность — передача значений из времени компиляции в рантайм. При компиляции Janet исполняет все инструкции верхнего уровня, а затем делает полный снапшот состояния программы на диск. Массивы сохраняют ссылки, генераторы помнят, на какой инструкции остановились. Это позволяет, например, на лету генерировать биндинги к БД по схеме SQL.
Синтаксис субъективно приятный. Скобки разбавляются [] для списков и {} для таблиц. Изменяемые литералы помечаются @. Анонимные функции коротаются через |. И никаких древних Lisp-соглашений: CAR тут first, LAMBDA — fn, nil не является пустым списком, а FORMAT вы не найдёте.