LINUX.ORG.RU

Lua 5.4

 


1

5

После двух лет разработки, 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 возвращает набор из четырёх значений вместо одного, для эмуляции старого поведения заключайте вызов в скобки, если подставляете его как параметр при вызове другой функции.

>>> Подробности

★★

Проверено: unfo ()
Последнее исправление: Virtuos86 (всего исправлений: 3)

Ответ на: комментарий от anonymous

Если закрытие сопровождается мгновенной отчисткой памяти, то да, тогда полный деструктор, иначе только только с оговорками. А по поводу переменных в одной строке моё мнение - для кода грязно, лучше избегать и писать в отдельных строках

AKonia ★★
()
Ответ на: комментарий от AKonia

... лучше избегать и писать в отдельных строках

Там прикол в том, что функция может возвращать несколько значений и, в этом случае, такое присваивание - выглядит довольно естественно. Типа:

a, b, c = fun(x)

Согласитесь, классно же.

qwe ★★★
()
Ответ на: комментарий от qwe

Согласен, но всё равно const/close в угловых скобках как то не ахти выглядит, да и в чём была бы проблема, если писали бы так:

const a, b, c = fun(x)

Да конечно, было бы стрёмно, если мы хотим не все переменные сделать постоянными, но если мы хотим, то не выглядит, ли следующий код через чур монструозно ?

-- можно было в качестве сахара предыдущий код 
-- считать эквивалентным данному
local a <const>, b <const>, c <const> = fun(x)

Хотя в такой записи есть и плюс, т.к. насколько я понял в угловых скобках можно через запятую и const и close писать, в общем вкусовщина, надо на практике смотреть, в целом ничего кардинально плохого в этом нет, да и необходимость в постоянных переменных не такая высокая, хотя вот закрываемые, уверен люди возьмут в оборот, т.к. ООП.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 1)
Ответ на: комментарий от Vudod

Современными вы называете языки из 90-ых ?) Чисто для информации несколько возвращаемых значений возвращали и в некоторых древних языках 70-80-ых, т.е. эпохи того же Си.

AKonia ★★
()

Lua – это простой интерпретируемый язык программирования

Не такой уж и простой, да и не удобный он.

Odalist ★★★★★
()
Ответ на: комментарий от AKonia

Я вроде бы ясно выразился, что «начиная с», а не ограничиваясь. Видимо, те языки, код на которых вы умеете сходу читать, не включают русский.

Vudod ★★★★★
()
Ответ на: комментарий от Odalist

Не такой уж и простой, да и не удобный он.

В основном согласен. Но... Для встраемых языков... Сравните с JavaScript.

IMHO - ну здорово же.

P.S. Лично мне нужен для mpv, но там даже и 5.3 нет. Сцуко... В этом языке оператор «goto» и числа без плавающей точки реально должны были быть изначально.

P.P.S. Давайте, вкидывайте в вентилятор по поводу «goto» и быдлокода.

qwe ★★★
()
Ответ на: комментарий от anonymous

обалдеть, конечно, придирки. То массивы с единицы не нравятся, то != сложно запомнить, то операторы перла забыли. Код строчите, видимо, не приходя в сознание?

anonymous
()
Ответ на: комментарий от anonymous

Код мы строчим на C++, а в недоязычки нужно изредка. Такие приколы порождают косяки на ровном месте. Специально обученная макака конечно будет эти грабли перепрыгивать. Да вот только зубрежка до уровня мышечной памяти всех операторов и закорючек очередного перла – сомнительный такой скилл, не слишком в жизни пригождается.

anonymous
()
Ответ на: комментарий от qwe

теоретики не любят целые числа. они считают, что целые числа - это подмножество чисел с плавающей запятой, поэтому первое может быть представлено последним, поэтому целые числа не нужны. а как работают компьютеры они себе представляют очень слабо, поэтому иногда язычок приходится доделывать аж через 30 лет, когда он наконец начинает применяться для чего-то сложнее чем hello world.

такое бывает, хорошо, что наконец доделали. в 5.5 доделают ещё что-то, в 5.6 ещё что-то.

anonymous
()
Ответ на: комментарий от anonymous

сомнительный такой скилл, не слишком в жизни пригождается.

как и любой дсл. тебе наверное к луа действительно не стоит приближаться потому что ты упорно отказываешься это понимать. но когда-нибудь поймёшь и тебе будет проще работать с одним дсл, чем с десятью разными.

anonymous
()
Ответ на: комментарий от anonymous

... Специально обученная макака конечно будет эти грабли перепрыгивать...

Не. Специально обученная макака будет стонать по поводу граблей. Остальным пофиг.

qwe ★★★
()
Ответ на: комментарий от anonymous

Угу. Сложно спорить с очевидным.

По мне, так плавающая точка не нужна. Целых достаточно. Точнее получается. С точкой - накапливающаяся ошибка.

qwe ★★★
()
Ответ на: комментарий от qwe

Сравните с JavaScript.

Это да, согласен.

Давайте, вкидывайте в вентилятор по поводу «goto» и быдлокода.

Нет, не буду.

Odalist ★★★★★
()
Ответ на: комментарий от anonymous

In 1993, the only real contender was Tcl, which had been explicitly designed to be embedded into applications. However, Tcl had unfamiliar syntax, did not offer good support for data description, and ran only on Unix platforms. We did not consider LISP or Scheme because of their unfriendly syntax.

дальше объяснять надо?

anonymous
()
Ответ на: комментарий от Crocodoom

потому что конкатенация и сложение - разные операции

anonymous
()
Ответ на: комментарий от Vudod

Это сишникам надо объяснять. В современных языках, начиная с Питона, это нормальное поведение.

Множественный возврат был и есть в C ещё до рождения всех упомянутых в этом требе языков =) (ну если я ничего не пропустил) называется это структуры =) Так что нечего тут гнать, одно и тоже только выглядит по разному и всё =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Именно поэтому я и спросил - все старое. За ссылку спасибо,но видел уже.

Capsid
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.