Автор LuaJIT вернулся к разработке и планирует выпуск LuaJIT 3.0

Майкл Полл (Mike Pall), создатель JIT-компилятора LuaJIT, отошедший от активной разработки проекта в 2015 году и ограничивавшийся с тех пор редким сопровождением ветки 2.1, вернулся к активной работе над проектом и опубликовал план синтаксических расширений будущей ветки LuaJIT 3.0.

Среди предлагаемых для LuaJIT 3.0 расширений:

  • Битовые операторы в виде встроенного синтаксиса вместо вызовов функций «bit.*»: «~a» (NOT), «a & b» (AND), «a | b» (OR), «a ~ b» (XOR), «a ‹‹ b`, «a ›› b» (логический сдвиг) и «a ~›› b» (арифметический сдвиг). XOR обозначен как «~», поскольку символ «^» в Lua занят возведением в степень.
  • Альтернативные («привычные») операторы в стиле C/JavaScript: «!» (not), «&&» (and), «||» (or) и «!=» (~=).
  • Оператор целочисленного деления «//» с округлением в сторону минус бесконечности и метаметодом «__idiv» (как в Lua 5.3+).
  • Тернарный оператор «a ? b : c» с поддержкой сокращённого вычисления.
  • Оператор безопасной навигации «?.» («a?.field», «a?.[key]», «f?.(…)», «obj?.:method(…)»), возвращающий «nil», если левый операнд равен «nil».
  • Оператор объединения с nil «a ?? b», возвращающий «b», только если «a» равно «nil».
  • Составные операторы присваивания: «+=», «-=», «*=», «/=», «//=», «%=», «&=», «|=», «~=», «‹‹=`, «››=», «~››=», «..=» и «??=». Индексное выражение в левой части вычисляется однократно.
  • Оператор «continue» для перехода к следующей итерации цикла, оформленный как «мягкое» ключевое слово (можно продолжать использовать как имя переменной).
  • Объявление «const» — блочная неизменяемая привязка локальной переменной; запрещены переприсваивание и повторное объявление в той же или вложенной области видимости (также «мягкое» ключевое слово).

В обсуждении дополнительно затрагиваются ещё не вошедшие в спецификацию идеи: выражение сопоставления с образцом через ключевое слово «in», индексируемый тип для vararg («…varg», «varg[i]»), краткий синтаксис лямбд («|x| -> expr»), оператор отложенного выполнения «defer» в стиле Go/Zig и присваивание в условии («if local x = … then»).

Появление расширений вызвало и критику: часть участников отметила, что нововведения окончательно превращают LuaJIT в отдельный язык, несовместимый с эталонным Lua 5.1. На это Полл ответил, что «этот корабль уплыл уже очень давно».

Документацию по языку планируется консолидировать в отдельное самостоятельное описание, в котором каждое расширение будет помечено версией, в которой оно появилось.

Источник: http://www.opennet.ru/opennews/art.shtml?num=65795