В ближайшем будущем выйдет новая версия популярного скриптового языка Lua (последнюю пару недель идёт шлифовка release candidates, никаких кардинальных изменений уже не будет; а следить за процессом можно по рассылке).
В данной статье я по-возможности кратко описываю некоторые важные изменения языка (полный список тут).
Первое, что бросается в глаза, а кого-то заставляет вздрогнуть, это скромная строчка "goto statement" в списке изменений. Т.е. в Lua 5.2 появится оператор goto (см. reference manual). Этому радикальному шагу предшествовали долгие баталии в рассылке, которые оформились в следующие ограничения:
Эти ограничения с одной стороны, не дадут сделать из кода спагетти, а с другой — не ограничивают область основного применения: замена continue (перейти на следующую итерацию цикла), redo (повторить итерацию цикла), retry (перезапустить цикл целиком) и break из вложенных циклов.
"yieldable pcall and metamethods" — больше возможностей у и проще работать с coroutines.
"tables honor the __len metamethod" — теперь можно задать свой способ считать длину таблицы, что пригодится в частности для proxy-arrays (эту фичу органично дополняет "new metamethods __pairs and __ipairs")
Под пунктом "new lexical scheme for globals" скрывается целый набор глобальных изменений (см. тут) — работа с окружением (environment) теперь выполняется явно, через таблицу _ENV (функции setfenv и getfenv остались в прошлом, функция load стала мощнее), причём _ENV — это upvalue для текущего chunk. Соответственно канула в Лету и функция module с её магией, а модули теперь надо задавать в явном виде (Reference Manual подсказывает: «It is easy to set up a module with regular Lua code. Modules are not expected to set global variables»). Почему убрали можно посмотреть тут (коротко: module ведёт себя непрозрачно и неожиданно), альтернативные способы объявления модулей тут (большинство рецептов будут одинаково работать как в 5.1, так и в 5.2), Lua uFAQ содержит следующий рецепт (только для 5.2):
В данный момент функция module имеет статус deprecated, в дальнейшем она будет полностью удалена.
Я перечислил «большие», на мой взгляд, изменения в языке; данный список исключительно субъективен. Полный список можно посмотреть тут и тут в официальном виде и очень коротко; подробнее Lua users wiki и Lua unofficial FAQ; очень подробно — рассылка lua-l.
В данной статье я по-возможности кратко описываю некоторые важные изменения языка (полный список тут).
Первое, что бросается в глаза, а кого-то заставляет вздрогнуть, это скромная строчка "goto statement" в списке изменений. Т.е. в Lua 5.2 появится оператор goto (см. reference manual). Этому радикальному шагу предшествовали долгие баталии в рассылке, которые оформились в следующие ограничения:
- нельзя перейти в область видимости не объявленной локальной переменной;
- нельзя перейти в тело функции.
Эти ограничения с одной стороны, не дадут сделать из кода спагетти, а с другой — не ограничивают область основного применения: замена continue (перейти на следующую итерацию цикла), redo (повторить итерацию цикла), retry (перезапустить цикл целиком) и break из вложенных циклов.
"yieldable pcall and metamethods" — больше возможностей у и проще работать с coroutines.
"tables honor the __len metamethod" — теперь можно задать свой способ считать длину таблицы, что пригодится в частности для proxy-arrays (эту фичу органично дополняет "new metamethods __pairs and __ipairs")
Под пунктом "new lexical scheme for globals" скрывается целый набор глобальных изменений (см. тут) — работа с окружением (environment) теперь выполняется явно, через таблицу _ENV (функции setfenv и getfenv остались в прошлом, функция load стала мощнее), причём _ENV — это upvalue для текущего chunk. Соответственно канула в Лету и функция module с её магией, а модули теперь надо задавать в явном виде (Reference Manual подсказывает: «It is easy to set up a module with regular Lua code. Modules are not expected to set global variables»). Почему убрали можно посмотреть тут (коротко: module ведёт себя непрозрачно и неожиданно), альтернативные способы объявления модулей тут (большинство рецептов будут одинаково работать как в 5.1, так и в 5.2), Lua uFAQ содержит следующий рецепт (только для 5.2):
local _M = {}
do local _ENV = _M -- меняем окружение на _M
function f1() return f2() end
function f2() return 42 end
end
return _M
В данный момент функция module имеет статус deprecated, в дальнейшем она будет полностью удалена.
Я перечислил «большие», на мой взгляд, изменения в языке; данный список исключительно субъективен. Полный список можно посмотреть тут и тут в официальном виде и очень коротко; подробнее Lua users wiki и Lua unofficial FAQ; очень подробно — рассылка lua-l.