Pull to refresh

Краткий обзор новшеств Lua 5.2

В ближайшем будущем выйдет новая версия популярного скриптового языка 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):
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.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.