После двух лет разработки, 29 июня тихо и незаметно вышла новая версия языка программирования Lua — 5.4.
Lua – это простой интерпретируемый язык программирования, который легко встраивается в приложения. Благодаря этим качествам, Lua широко используется как язык расширения или описания конфигурации программ (в частности, компьютерных игр). Распространяется Lua по лицензии MIT.
Предыдущая версия (5.3.5) выходила 10 июля 2018 года.
Основные изменения в новой версии
-
новый сборщик мусора на основе поколений (generational). В функции
collectgarbage
параметрыsetpause
иsetstepmul
объявлены устаревшими, вместо них рекомендуется использовать параметрincremental
; -
новая функция для выдачи предупреждений
warn
с возможностью отключения их отображения; -
новая реализация
math.random
использует алгоритмxoshiro256**
вместо предоставляемого libc и инициализирует генератор случайным числом; -
константы (constant variables);
-
«закрываемые» (to-be-closed) переменные — локальные константы, для которых выполняется метод
__close
при выходе из области видимости;
-
новая функция
lua_resetthread
— очищает стек и выполняет закрытие всех «закрываемых» переменных; -
новая функция
coroutine.close
— закрывает указанную сопрограмму и все её «закрываемые» переменные; -
пользовательские данные (userdata) могут содержать набор значений с доступом по индексу. Для работы с ними введены новые функции:
lua_newuserdatauv
,lua_setiuservalue
иlua_getiuservalue
; -
доступна отладочная информация о параметрах и возвращаемых значениях функций;
-
если в цикле по счётчику
for
используется целочисленный индекс и происходит переполнение — цикл завершается; -
в функцию
string.gmatch
добавлен необязательный аргумент, задающий смещение от начала строки для поиска совпадений; -
функции неявного преобразования строк в числа перемещены в строковую библиотеку, изменилось их поведение. Например, результат операции
"1" + "2"
теперь целое число, а не число с плавающей точкой; -
в функции выделения памяти допустимо возникновение ошибки при сокращении блока памяти;
-
новый символ форматирования в функции
string.format
—%p
(для указателей); -
библиотека
utf8
принимает коды символов вплоть до 2³¹ (при указании специального флага, без него допускаются только коды до 0x10FFFF и не допускаются суррогаты); -
целочисленные константы, выходящие за пределы диапазона значений, преобразуются в плавающие числа (ранее происходило битовое отсечение);
-
метаметод
__lt
больше не используется для эмуляция метаметода__le
, при необходимости, метаметод__le
должен быть задан явно; -
метка для оператора
goto
не может быть создана, если в текущей области видимости уже существует метка с таким же именем (даже если она была определена во внешней области); -
метаметод
__gc
может быть не только функцией. Если попытка вызвать метод не удаётся, будет выведено предупреждение; -
функция
print
не вызываетtostring
для каждого аргумента, а использует свои внутренние преобразования; -
функция
io.lines
возвращает набор из четырёх значений вместо одного, для эмуляции старого поведения заключайте вызов в скобки, если подставляете его как параметр при вызове другой функции.
>>> Подробности