30 Июня состоялся предварительный (бета) релиз новой версии языка программирования Lua
.
Lua
– это встраиваемый, интерпретируемый язык программирования, используемый
в огромном числе программных продуктов как язык-компаньон.
- Новое ключевое слово
global
служит для управления глобальной областью видимости. Сразу стоит уточнить, это не просто противоположность ключевому словуlocal
. По умолчанию в каждом исполняемом чанке, происходит неявное объявлениеglobal *
, при этом ничего не происходит код работает точно также как и прежде. Объявлениеglobal
со звёздочкой*
указывает на то что все глобальные переменные просто доступны глобально. При желании можно записать это явно, например
global *
print(math.pi)
Таким образом сохраняется старое поведение.
Если же через global
объявить переменную, то вся глобальная область видимости
удаляется и в глобальной области видимости будет только эта и все последующие
явно декларированные переменные как глобальные, попытка обратится к неявно
декларированной глобальной переменной или неявно создать её приведёт к ошибке.
global x -- очистить глобальную область видимости и внести в неё "x"
x = 42 -- допустимо, "х" в глобальной области видимости чанка
y = 42 -- ошибка переменная "y" не определена
print(x+y) -- ошибка функция "print" не определена
Если вы используете ключевое слово global
не с *
то после его использования
требуется явно декларировать все используемые вами глобальные переменные.
global x, y, print
x = 42
y = 42
print(x+y)
или
global x
global y
global print
print(x+y)
Тем самым вы можете изолировать модуль, тело функции, тело условия или тело цикла от глобальной области видимости и задать её там явно.
Вы можете в любой момент времени указать в коде global *
чтобы вернуть видимость
всех глобальных переменных назад, для всего последующего за этим объявлением кода.
Можно сделать константными все глобальные переменные.
global <const> *
Но при этом важно отметить что (на данный момент) global
будучи применённый
к таблице, делает константным только таблицу, в неё нельзя внести новые значения,
но не делает константным значения таблицы.
global <const> math, print -- или global <const> *
math.pi = 42
print(math.pi)
Будет выведено 42
. Читайте документацию и обсуждение, экспериментируйте.
Также для обратной совместимости с прошлыми версиями языка, по причине того что global
может использоваться как имя переменной, сейчас возможно использование этого имени и как имени переменной и как ключевого слова.
local global = 42
print(global)
global <const> x
x = 42 -- сработает ошибка
Это поведение обратной совместимости можно отключить на этапе сборки, отключив LUA_COMPAT_GLOBAL
Другие изменения
- Счётчики в циклах
for
отныне являются константами, попытка их изменения вызывает ошибку, вLua5.4
и ниже, изменение значение счётчика в цикле сбрасывалось на следующее значение счётчика, так как счётчики циклов не изменяемые
for i=1,100 do
i = 10 -- ошибка для Lua 5.5
print(i)
end
Если вам нужна переменная с именем счётчика, и совместимость с предыдущими версиями языка, то объявите её как local
for i=1,100 do
local i = 10
print(i)
end
-
float
значения печатаются с таким количеством знаков, чтобы быть правильно прочитанными обратно -
Новая функция
table.create
есоздаёт новую таблицу с предварительно выделенной памятью, это полезно с точки зрения производительности, когда вы сразу знаете сколько элементов будет в таблице. -
utf8.offset
теперь дополнительно возвращает финальную позицию символа
print(utf8.offset("привет",2))
Lua5.4
и ранее, вернут 3 Lua5.5
вернёт 3 и 4
-
Lua C API
Внешние строки (external strings) черезlua_pushexternalstring
для использования данных в обход автоматического управления памяти, строка должна иметь\0
в конце. -
Lua C API
Новая функцияluaL_openselectedlibs
в отличии отluaL_openlibs
позволяет выборочно загрузить/предзагрузить, нужные части стандартной библиотекиLua
вpackage.loaded
,packege.preload
из списка
LUA_GLIBK : the basic library.
LUA_LOADLIBK : the package library.
LUA_COLIBK : the coroutine library.
LUA_STRLIBK : the string library.
LUA_UTF8LIBK : the UTF-8 library.
LUA_TABLIBK : the table library.
LUA_MATHLIBK : the mathematical library.
LUA_IOLIBK : the I/O library.
LUA_OSLIBK : the operating system library.
LUA_DBLIBK : the debug library.
- Оптимизация памяти, большие
Lua
массивы теперь потребляют до60%
меньше памяти
mem.lua
collectgarbage("stop")
local array = { }
for i=1,10000000 do
array[i]=i
end
print(collectgarbage("count") * 1024)
Вывод показателей памяти в байтах (потребление памяти, в этом тесте, упало более чем на 40%)
dron@gnu:~/$ lua5.4 mem.lua
268457462.0
dron@gnu:~/$ lua5.5 mem.lua
151015205.0
- Возможность возврата сложных конструкций вида
return {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}}}}}}}
Это не работало в 5.4 и выдавало ошибку «function or expression too complex» или «function or expression needs too many registers»
- Удалена опция сборки
LUA_COMPAT_5_3
(совместимость с 5.3) lua.c
загружает функциюreadline
динамически- Удалена опция
LUA_USE_READLINE
и цели сборкиlinux-readline
andlinux-noreadline
дляLinux
И другие изменения описанные по ссылкам ниже и в документации. Lua 5.5 – это разрабатываемая на данный момент версия языка, публичный бета релиз нацелен на обратную связь, критика и предложения приветствуются в списке рассылки (абсолютно любое обсуждение, предложения и код рассматриваются исключительно там)
>>> Анонс Lua5.5 релиза в списке рассылки
>>> Описание основных изменений
>>> Прямая ссылка на архив исходного кода
>>> Прямая ссылка на архив с тестами
>>> Подробности