LINUX.ORG.RU

Вышла Lua 5.2

 ,


0

0

Завершена работа над новой версией популярного встраиваемого языка програмирования Lua. Выпущены руководство (reference manual) с описанием новой версии языка (5.2), набор тестов для реализаций Lua версии 5.2 и образцовый (референсный) интерпретатор версии 5.2.0.

Вот основные изменения в новой версии языка:

  • Можно вызывать yield из защищенного вызова (pcall) и метаметодов.
  • Новый метод работы с окружениями и глобальными переменными. В частности, функции getfenv/setfenv больше не работают.
  • Появилось стандартное API для битовых операций.
  • Изменение в C API: появились т.н. «облегченные нативные функции» («light C functions»), представляющие собой простые указатели на функции. В отличие от полноценных замыканий, они не имеют окружения, что позволяет экономить системные ресурсы.
  • В языке появился оператор goto.
  • Изменение в сборке мусора: таблицы со слабыми ссылками на ключи и с сильными ссылками на значения теперь будут работать как таблицы эфемеронов.
  • Теперь у таблиц могут быть финализаторы.
  • Помимо уже существующего инкрементного сборщика мусора, интерпретатор теперь имеет экстренный сборщик мусора, который освобождает память, если не удается выделить новую. Кроме того, появился экспериментальный сборщик мусора с учетом поколений (generational GC), но он по умолчанию отключен.

Полный список изменений можно прочитать в файле README, находящемся в дистрибутиве Lua.

Нововведения в языке привели к несовместимости Lua 5.2 и 5.1. Возникшие проблемы совместимости задокументированы в руководстве. Впрочем, теоретически существует возможность написать программу так, чтобы она исполнялась и на Lua 5.1, и на 5.2. Lua не стремится сохранять обратную совместимость: например, версия 5.1 не была совместима с 5.0. Разработчики отмечают, что совершенно необязательно переводить существующие приложения со скриптингом на Lua на новую версию языка.

С момента выпуска Lua 5.1 прошло около четырех лет. Первая альфа-версия 5.2 вышла примерно год назад. Образцовый интерпретатор распространяется по лицензии MIT.

>>> Сайт Lua

★★★★★

Проверено: maxcom ()
Последнее исправление: proud_anon (всего исправлений: 4)

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

В луа этот блок выглядит так:

pcall(function () for i = 1, n do ... end end )

Это всего лишь вызов конкретной функции с аргументом конкретного типа. К утверждению о том, что error() завершает текущий скоп, это не имеет никакого отношения. error() завершает таки не скоп вообще, а только две его разновидности, и этим он существенно отличается от «классических» исключений.

на это и был намек. Разница только в синтаксисе. В одном случае это try ...скоп... catch, а в другом pcall(function() ...скоп... end

Не согласен. Семантически это тоже разные вещи. function - это, как ни крути, функция, со всеми вытекающими.

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

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

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

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

http://metalua.luaforge.net/metalua-manual.html#htoc55

http://metalua.luaforge.net

Ах, вот вы о чём! Так это же не стандартный Lua. Так можно взять любой компилятор под свободной лицензией, добавить в него свои фичи, а потом сказать, что данный язык эти фичи поддерживает :)

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

использоание goto - стиль быдлокодера

Данная фраза - признак быдлокодера. Хороший стиль определяется не по наличию/отсутствию в нём goto.

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

а чем такой break принципиально отличается от goto кроме названия?

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

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

таких if обычно штук 5-10

Обычно? «Ты гонишь, ямщик» (с)

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

Как показывает практика слепое следование рекомендациям для студентов вида «не использовать goto» или «один return на функцию» и т.п. может запутать код куда больше чем goto.

Просто надо добавлять «любое правило можно нарушать, если у вас есть очень веские причины».

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

Он бесконечно прост и универсален.

Не так уж и прост, имхо, Io проще будет.

anonymous
()

goto это хорошо, но больше хотелось бы чего-то вроде continue, которого в lua очень не хватает :(

а еще грустно, что теперь INSTEAD 1.6 не будет совместим со старыми версиями, так как goto стало служебным словом, пришлось функции goto переименовывать в walk... :)

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

В некоторых языках, вроде java, break имеет возможность перехода на меткую Это куда более красивое решение. И логичное.

Это не красивое решение, это очковтирательство: заказчик или начальник требуют «трахайтесь как хотите но чтобы этого оператора не было» и трахаются размещая его функционал по другим операторам.

Ну и надо так составлять условия цикла, Что-бы выход не по условию был исключительным действием, не правилом. Чем меньше безусловных переходов - тем лучше.

if a<>b(z) then goto 1;

Где здесь _безусловный_ переход, ты его видишь ;)

А то умельцы не только в циклах его используют

a:=0;
1:
inc(a);
.......................
if a>=10 then goto 1;

Цикл! Получите и распишитесь. Если задача требует, то почему бы и не использовать, не для всех ынтерпрайз наклепал готовые либы на каждый чих: все классы и процедуры уже написаны, тебе нужно лишь склеить из них изделие.

iногда код превращается в лапшу в стиле всеми любимого bash.

А ты хочешь понимать любую чужую программу, наивный. Для человека это тяжело.

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

rpm -qi python | grep Size

Size : 23000444 License: Python

[user@marina ~]$ rpm -qi lua | grep Size

Size : 618031 License: MIT

Ты бы ещё sh сравнил бы с питоном! Питон - высокоуровневый язык общего назначения, а не крошечный язык для скриптиков в играх.

тормозной и глючный... пестон.

Как вы все заставляете его глючить??

сложный

А, понял. Питон может быть сложным только для полных дегенератов.

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

Ты, ничтожество, сейчас самого Кнута быдлокодером назвал. Читай его игру adventure, сопляк.

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

Если сказать студенту показать правило и тут же сказать что его можно нарушать то он найдет миллион причин нарушить его )

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

и вполне заслуженно назвал

только быдлокодер будет городить высшематематическую ассемблерную заумь там, где всё вполне элементарно решается киданием компонент на формочку в Visual Studio

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

Если сказать студенту показать правило и тут же сказать что его можно нарушать то он найдет миллион причин нарушить его )

Взвесить причины и надавать по рукам. Смысл обучения как раз в том, что студент делает ошибки в контролируемой среде.

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

Axis использует в cgi на своих камерах, видел на одной.

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

беда только в том что позже забывают сказать что это всего лишь рекомендации )

Вообще была бы хорошей практика студентов давайть в помощь на какие-либо академические опен сорц проекты, где они могли бы посмотреть как пишут профессионалы да и сами набить руку немного. Такое встречается конечно но в виде исключения =(

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

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

Лоровские профессоры поднимают настроение )

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

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

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

Я не знаю почему ты возомнил себя «истинным художником» да и еще так пренебрежительно говорить о людях которые явно умнее тебя (это факт), но у меня есть для тебя один совет, наверно последний твой шанс. В начальной школе преподают такое произведение одного Истинного Художника (это без сарказма) И.А. Крылова, называется оно «Свинья под дубом» - ознакомься с ним, если мораль той басни тебя не натолкнет на некоторые раздумья то боюсь тебе ничего не поможет уже.

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

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

...которые фотошопят бл*дей на рекламных плакатах. Ъ художники, да %)

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

kernel32.dll - это нихрена не ядро, это юзерспейсная библиотека.

С точки зрения и в _терминологии_ winAPI - это именно что ядро, и когда тейлганнер ссылаясь на кого-то говорил об «исключениях в ядре», речь там шла именно об этом ядре.

Как и ntdll.dll. Это типа libc в *nix. Ядро - это ntoskrnl.exe

Не болтай ерундой. ntdll.dll - это winapi интерфейс для вызовов из ntoskrnl.exe, с отображением 1:1, а никакое не подобие libc.

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

говорить о людях которые явно умнее тебя (это факт)

чувак, я тя умоляю, задротство инженера в пределах своего тесного мирка - это не ум, это заточка

В начальной школе преподают такое произведение одного Истинного Художника (это без сарказма) И.А. Крылова, называется оно «Свинья под дубом» - ознакомься с ним, если мораль той басни тебя не натолкнет на некоторые раздумья то боюсь тебе ничего не поможет уже.

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

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

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

когда тейлганнер ссылаясь на кого-то говорил об «исключениях в ядре», речь там шла именно об этом ядре.

Нет. Речь шла о ntoskrnl.exe (NT executive).

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

убожество, залупа ты макакина, где ты в adventure нашел математику?

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

Я надеялся что ты поржешь надо мной и скажешь что это был сарказм, но видимо ты и есть на самом деле либо жирнющий тролль либо фееричный долбо*б, одно другого не лучше =)

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

Еще раз, лошок: http://www-cs-staff.stanford.edu/~uno/programs/advent.w.gz

Это как раз типа «творчество». Никакой математики и никакого инженерного говна. И сплошное goto при этом. Просто признай, сявка, что ты сморозил чушь. Признай себя никчемным, бестолковым уродцем - тем более что все присутствующие и так составили уже о тебе именно такое мнение.

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

Забивание гвоздей микроскопом - это всякие там классы-херасы городить, с паттернами и прочим говном там, где тупо хватает goto.

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

чувак, если у тебя какие-то проблемы - не нужно гавкать на тех ,кто умнее тебя

просто сходи, хм, к психотерапевту, что ли, попроси, чтобы он тебя, например, усыпил

Никакой математики и никакого инженерного говна. И сплошное goto при этом

гоуту - это тоже признак быдлокодерства, это да

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

да я вообще не понимаю этих дурачков, что стремятся писать программы в хорошем стиле, ведь зачастую тупо хватает индусокода!!

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

Извините, не сдержался. Редко на моем пути встречаются столь яркие личности, ваша точка зрения поразила меня до самой глубины души. Постараюсь больше не выплескивать своих эмоций.

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

Речь шла о ntoskrnl.exe (NT executive).

Ну так надо было это явно уточнить. Либо ты не правильно понял источник, либо источник соврал. Потому что в пространстве ядра никакой поддержики исключений нет. Есть SEH в реализации winapi, которое для ядра выглядит как пространство пользователя, и что угодно может быть в драйверах пользовательского режима, типа драйверов для принтера и т.п.

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

Идиот? В данном случае именно goto это хороший стиль, потому как goto однозначно соответствует семантике предметной области - концепции перехода между состояниями. Любая другая конструкция (и тем более всякое убогое ООП) запутала бы суть кода.

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

чувак, если у тебя какие-то проблемы - не нужно гавкать на тех ,кто умнее тебя

Сява, то, что ты на пару порядков тупее даже такого дебила, как я, очевидно всем кроме тебя самого.

гоуту - это тоже признак быдлокодерства, это да

Обосновать-то это ты зассал, сява.

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

Ну так надо было это явно уточнить

Я сказал «ядро» - это код, исполняющийся в режиме ядра. И нет, kernel.dll не исполняется в режиме ядра.

Либо ты не правильно понял источник, либо источник соврал

То есть могут ошибаться все, кроме тебя?

http://www.osronline.com/article.cfm?article=469

«If you've been working in kernel-mode on Windows for any significant amount of time, you've almost certainly encountered Structured Exception Handling (SEH). Basically, SEH is the standard kernel-mode exception handling mechanism that's built into Windows

[...]

This will always result in a call to _C_specific_handler for kernel-mode code running on current versions of Windows. _C_specific_handler will then begin walking all of the SCOPE_TABLE entries searching for a match on the faulting instruction, and will hopefully find an __except statement that covers the offending code».

Ты вообще действующий вендовый драйверописатель или как?

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

Такими темпами их уже три будет, как диалектов Лиспа)

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

С точки зрения и в _терминологии_ winAPI - это именно что ядро

ядро - это то что выполняется в нулевом кольце защиты

Не болтай ерундой. ntdll.dll - это winapi интерфейс для вызовов из ntoskrnl.exe, с отображением 1:1, а никакое не подобие libc.

Бред. Документированные функции WinAPI экспортируются из kernel32.dll, user32.dll, advapi32.dll и т.д. При этом они являются обертками над Native API, функции которого находятся в ntdll.dll. А уже внутри ntdll.dll дергаются прерывания системных вызовов и происходит переход в режим ядра. То же самое делает libc - оборачивает системные вызовы через прерывание int 0x80 (для linux вроде так) в С-шные функции

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

Все goto-фобы - тупые, безграмотные дебилы, не осилившие Кнута.

Анон, ты прав. А чё озлобленный такой? ;)

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

А goto-филы не осилили всеми любимого Н.Вирта. А ведь он был светочем в разработке ЯП с низким порогом вхождения. Гением. Ну и Java/С# обязаны своим происхождением ЯП Oberon от Вирта.

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

Похоже, что вы разбираетесь в низкоуровневом устройстве ОС. То что я читал по данной теме(когда интересовался тем, как переходить из третьего кольца в нулевое) согласуется с написанным вами. Я просто любопытствовал, а вы наверное драйвера писали? Мало кто разбирается в вопросах, связанных с нулевым кольцом, фанам высокоуровневых ЯП и библиотек оно даром не надо.

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

Ничем. Но трубить об этом неофитам не принято;) Главное, что они должны знать - goto есть зло, великое зло:)

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

Ок, признаю, SEH может использоваться и в пространстве ядра.

То есть могут ошибаться все, кроме тебя?

Нет, почему же? Вот ты, к примеру, утверждал, будто в венде для ядра используются плюсовые исключения... :3

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

Бред. Документированные функции WinAPI экспортируются из kernel32.dll, user32.dll, advapi32.dll и т.д. При этом они являются обертками над Native API,

Бред. Большая часть функций из этих библиотек не является никакими обёртками над Native API, а является самостоятельным кодом, реализующим winapi интерфейс.

То же самое делает libc - оборачивает системные вызовы через прерывание int 0x80 (для linux вроде так) в С-шные функции

Врапперы для сисколов - это не основное назначение libc. Основное назначение libc - это реализация стандартной библиотеки языка C. Врапперы для сисколов строго говоря могут вообще отсутсвовать в libc.

Вендовым аналогом (точнее - реализацией) libc является msvcrt.dll

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

Lua всё больше скатывается в питон

ты, дурилка картонная, видимо имел ввиду turbopascal. python, как любой приличный язык, имеет exceptions и не имеет goto.

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

Была б моя воля тем кто выходит из вложенных циклов с помощью исключений тоже руки бы поотбивал. Исключения даже по смыслу названия можно понять что предназначены для исключительных ситуаций не предусмотренных логикой программы или алгоритма. Для использования в штатных ситуациях у никак не предназначены, слишком громоздкий механизм. Все таки даже всяким скриптопейсателям не помешало бы знать как работает та или иная вещь под капотом.

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

error() завершает таки не скоп вообще, а только две его разновидности, и этим он существенно отличается от «классических» исключений.

«классическое» исключение тем более завершает не скоп вообще, а конкретно скоп try ... catch

Не согласен. Семантически это тоже разные вещи. function - это, как ни крути, функция, со всеми вытекающими.

ерунда. Разница только в том, что мы хорошо себе представляем, что такое pcall и понятия не имеем, что такое try...catch. Это может быть функция? Может. А может отдельный тред, а может отдельный форк, а может if not строчка then return err в каждой строчке или запущеный дебаггер.

Не вижу большого преимуществ в параметрах.

не вижу и нет - большая разница.

Определи переменные, локальные для данного скопа и инициализируй их нужными значениями - то же самое.

неа. переменные определяются снаружи, в то время как твой вариант все делает изнутри блока. Чтобы было понятней, функция может определяться или грузиться из файла или строки на лету, а переменные в нее передаются снаружи.

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

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

Ах, вот вы о чём! Так это же не стандартный Lua. Так можно взять любой компилятор под свободной лицензией, добавить в него свои фичи, а потом сказать, что данный язык эти фичи поддерживает :)

Именно гибкость стандартного lua позволяет проводить такие фокусы. И если эти возможности нужны - вот они. Но дело как раз в том, что привыкши к с++ и пестону искал в свое время в луа try/catch, но очень скоро выяснил, что все эти атавизмы ООП в столь гибком языке, как луа скорее мешают, чем помогают. Так что ничего удивительного, что этого нет в стандарте.

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