8. Несовместимость с предыдущей версией

8. Несовместимость с предыдущей версией

Здесь приведены случаи несовместимости, которые можно найти при переводе программы из Lua 5.2 в Lua 5.3. Некоторых видов несовместимости можно избежать компиляцией в Lua с соответствующими параметрами (смотрите файл luaconf.h). Впрочем, в будущем, все эти варианты совместимости будут удалены.

Версии Lua всегда могут изменять C-ишный API способами, которые не подразумевают изменений исходного кода в программе, таких как числовые значения констант или реализация функций как макросов. Поэтому не следует предполагать, что бинарные файлы являются совместимыми в разных версиях Lua. При использовании новых версий, всегда перекомпилируйте программы, где применяется Lua API.

Точно так же, Lua версии всегда могут изменить внутреннее представление предварительно скомпилированных блоков; в разных версиях Lua предварительно скомпилированные блоки несовместимы.

Стандартные пути в официально распространяемом пакете могут изменяться в зависимости от версии.

8.1 – Изменения в языке

  • Основная разница между Lua 5.2 и Lua 5.3 заключается во введении целочисленного подтипа для чисел. Хотя это изменение не должно влиять на “обычные” вычисления, некоторые расчеты (в основном те, где предполагается некоторое переполнение) могут давать разные результаты. Эти различия можно исправить, переводом числа в значение с плавающей запятой (в Lua 5.2 все числа были с плавающей запятой), в частности написанием констант с окончанием .0 или использования x = x + 0.0 для конвертирования переменной.
    (Эта рекомендация только для быстрого исправления при случайной несовместимости; она не годится в качестве основного руководящего принципа для правильного программирования. Для хорошего написания программ, там где требуются числа с плавающей запятой используйте числа с плавающей запятой, а целые числа используйте там, где нужны целые числа.)
  • Преобразование чисел с плавающей запятой в строки теперь добавляет к результату суффикс .0, если они выглядят как целые числа. (Например, число с плавающей запятой 2.0 (в англоязычном варианте это называется число с плавающей точкой) будет напечатано как 2.0, а не как 2.) Следует всегда использовать явно заданный формат, когда нужен конкретный формат чисел. (Формально говоря, это не является несовместимостью, так как Lua не указывает каким образом числа форматируются как строки, но некоторые программы предполагают определенный формат.)
  • Был удален [“поколенческий” режим] (generational mode) для сборщика мусора. (В Lua 5.2 он был сделан в качестве эксперимента.)

8.2 – Изменения в библиотеках

  • Библиотека bit32 устарела. Теперь просто понадобится совместимая внешняя библиотека, или, еще лучше, замена её функций на соответствующие битовые операции. (Имейте ввиду, что bit32 оперирует 32-битными целыми числами, в то время как битовые операторы в Lua 5.3 работают с целыми числами Lua, которые по умолчанию имеют 64 бита.)
  • Библиотека таблиц в настоящее время учитывает метаметоды для установки и получения элементов.
  • Итератор ipairs сейчас соблюдает метаметоды и её собственный метаметод __ipairs теперь устарел.
  • Имена опций в io.read больше не имеют начального символа ‘*’. Чтобы обеспечить совместимость, Lua продолжит принимать (и игнорировать) этот символ.
  • В математической библиотеке устарели следующие функции: atan2, cosh, sinh, tanh, pow, frexp, и ldexp. Можно заменять math.pow(x,y) на x^y; можно заменять math.atan2 на math.atan, которая теперь принимает один или два параметра; можно заменять math.ldexp(x,exp) на x * 2.0^exp. Для других операций можно использовать либо внешнюю библиотеку, либо реализовать их в Lua.
  • Поисковик для загрузчиков C используемый функцией require изменил способ обработки имен версий. Теперь, версия следует после имени модуля (как это принято в большинстве других инструментов). Чтобы обеспечить совместимость, этот поисковик все еще пытается работать в старом формате, если не может найти открытую функцию в соответствии с новым стилем. (Lua 5.2 уже работал таким образом, но это было не документированное изменение.)
  • Вызов collectgarbage(“count”) теперь возвращает только один результат. (Второй результат можно вычислить из дробной части первого результата.)

8.3 – Изменения в API

  • Функции-продолжения теперь принимают в качестве параметров все что нужно было получать через lua_getctx, так что lua_getctx был удален. Соответственно адаптируйте свой код.
  • Функция lua_dump теперь имеет дополнительный параметр, strip. Чтобы получить старое поведение, используйте 0 в качестве значения этого параметра.
  • Функции для inject/project беззнаковых целых чисел (lua_pushunsigned, lua_tounsigned, lua_tounsignedx, luaL_checkunsigned, luaL_optunsigned) устарели. Используйте их знаковые эквиваленты с приведением типа.
  • Макросы для project целочисленных типов не по умолчанию (luaL_checkint, luaL_optint, luaL_checklong, luaL_optlong) устарели. Используйте их эквивалент поверх lua_Integer с приведением типа (или, когда возможно, используйте в своем коде lua_Integer).