OptimusZero
я вот не поленился и за 3 минуты http://lua-users.org/wiki/LuaXml
FailsBot
Чот system() барахлит! Не смог получить инфо о батарейке.
Wsevolod
Как писать либу, где используются битовые операции для разных версий луа? В <=5.3 используется _G.bit, в 5.4 — инфиксные операторы
Aydar
Как писать либу, где используются битовые операции для разных версий луа? В <=5.3 используется _G.bit, в 5.4 — инфиксные операторы
Самый простой вариант, проверять версию луа и если она 5.4 или больше объявить битовые функции. Версию можно узнать из переменной _VERSION А функции объявить подобным образом function bit.band(a,b) return(a&b) end function bit.bor(a,b) return(a|b) end function bit.lshift(a,b) return(a<<b) end
Snusmumriken
(правильным решением было бы изначально делать транслятор результата труда мартышки с мышкой не в XML, а сразу в Lua)
Слушай, фига ты злой, мы там чуть выше уже определились с тем, как преобразовывать "конкретные примеры xml с конкретными последовательностями действий" в lua, и даже изобрели пару способов. Ну типа можно уже не выпендриваться, про "ЛЮБЫЕ xml" речи не было, контекст уже появился )
Daniil
Всем привет!
Daniil
Такой вопрос: если я внутри функции создаю локальную функцию, в Луа она каждый раз будет создаваться, или инстанс будет один, а контексты разные?
Daniil
Такой вопрос: если я внутри функции создаю локальную функцию, в Луа она каждый раз будет создаваться, или инстанс будет один, а контексты разные?
Например, практика создания функции для sort. table.sort(t, function(a, b) returb a < b end) Если я в цикле 10 раз такой код вызову, будет создано 10 таких функций или 1?
Aydar
Такой вопрос: если я внутри функции создаю локальную функцию, в Луа она каждый раз будет создаваться, или инстанс будет один, а контексты разные?
По идее должно быть 10 разных функций, в момент выхода из функции все локальные значения "уничтожаются", функцию можно сохранить если оставить ссылку на нее например в глобальной переменной.
Igor
Daniil
А в цикле?
Igor
Аналогичное поведение будет
Igor
Я просто показал, что каждый раз новая функция создается.
Daniil
Аналогичное поведение будет
В смысле 10 разных адресов, верно?
Igor
Да
Igor
В бесконечном цикле получится утечка памяти
Daniil
Я просто показал, что каждый раз новая функция создается.
Ну вот на 1 экземпляре, прост, это не очень очевидно было)) Но спасибо! Именно это я и хотел узнать.
Igor
Ну, если мусорщик спит
Daniil
Угу, принял.
Daniil
если не хочешь 10 копий - создавай её снаружи
Да, это давно практикую. Но тут решил поделиться этим опытом с другими, но засомневался в аргументах. Значит все правильно написал, да. Ещё раз спасибо!
Daniil
Поковырял еще. Всё-таки стоило тут цикл сделать. Тогда бы мы увидели одни и те же адреса этих функции. Подсказали почитать статью 6.1 из доки к Lua. И судя по тому, что там написано, хранится только блок данных для замыкания (локально определенные переменные, например). А функции все в одном экземпляре.
Igor
Хм, не знал
Alexey
Вообще это еще от версии зависит https://www.lua.org/manual/5.2/manual.html#8.1 Equality between function values has changed. Now, a function definition may not create a new value; it may reuse some previous value if there is no observable difference to the new function. Но как эта observable difference определяется - как-то не очень понятно
Alexey
И вроде ujit такое тоже делает, но я не уверен
Snusmumriken
Например, практика создания функции для sort. table.sort(t, function(a, b) returb a < b end) Если я в цикле 10 раз такой код вызову, будет создано 10 таких функций или 1?
Ключевое слово function — всегда создаёт новую функцию. Вообще всегда. Точно так же как {} — создаёт новую таблицу.
Snusmumriken
Только с 5.2
Daniil
Ключевое слово function — всегда создаёт новую функцию. Вообще всегда. Точно так же как {} — создаёт новую таблицу.
Ну если глянуть на указатели таким образом созданных функций, то они не меняются. Поэтому аналогия между function и {} в этом смысле не работает.
Daniil
Только с 5.2
Это гуд. Там действительно много классных изменений было.
Snusmumriken
Ну, фигня в том, что за счёт версионности, приходится считать что "данный случай является худшим". Всегда так делаю, готовлюсь к худшему )
Daniil
Ну, фигня в том, что за счёт версионности, приходится считать что "данный случай является худшим". Всегда так делаю, готовлюсь к худшему )
Думаю, тут полезно будет, все же, учитывать специфику проекта. Если он гуляет по разным платформам, то да. А если это конкретный движок, который развивается в одном векторе, то уже так перестраховываться смысла меньше. Сам раньше так делал тоже: типа выработал привычку и норм - пишешь код без кучи детских и непонятных ошибок. Но несколько проектов спустя обратил внимание, что привычки в таких вещах несколько зашоривают. И в долгосрочном плане выгоднее пересматривать и вырабатывать новые правила для каждого проекта. Сохраняет живость ума и побуждает задавать новые вопросы.)
Daniil
Сорян за такую телегу.. Три часа ночи всё же - навевает))
Snusmumriken
В моём случае примерно так: есть некоторый жёсткий набор правил (их немного, где-то 3.5 штуки), и есть специфика проектов, которые мержатся с базовым комплектом с заменой.
Snusmumriken
Но всё что угодно, что может попасть на широкое обозрение, должно быть вылизано, шоб прям кто угодно мог взять и запустить, проверить, сразу использовать и т.д.
Igor
Ну если глянуть на указатели таким образом созданных функций, то они не меняются. Поэтому аналогия между function и {} в этом смысле не работает.
Я не углублялся в вопрос, но ты уверен, что эти адреса не являются какими-нибудь локальными регистрами, куда временно пишется адрес фунукции?
Snusmumriken
Я не углублялся в вопрос, но ты уверен, что эти адреса не являются какими-нибудь локальными регистрами, куда временно пишется адрес фунукции?
Весь подобный хлам должен создаваться в LUA_REGISTRY, и оттуда же должен вытираться, в случае если ссылок больше не осталось.
Igor
Igor
¯\_(ツ)_/¯
Daniil
Нужны сравнительные тесты, чтобы увидеть, что это не просто стек от вызовов.
Aydar
Нужны сравнительные тесты, чтобы увидеть, что это не просто стек от вызовов.
По-моему не надо завязываться на недокументированную фичу зависящую от реализации, соответственно смысла тестировать это тоже нет.
Daniil
По-моему не надо завязываться на недокументированную фичу зависящую от реализации, соответственно смысла тестировать это тоже нет.
Пока непонятно, почему недокументированную. Мы же из доки эту инфу почерпнули. Причём из официальной. И реализация с учётом необходимости хранения данных для замыкания, как мы поняли, начинается с 5.2 Но я поддерживаю идею, что чем гибче язык, тем строже на нем надо писать, чтобы уменьшить количество ошибок. Просто хотелось до конца разобраться в этом кейсе.
Aydar
Вообще это еще от версии зависит https://www.lua.org/manual/5.2/manual.html#8.1 Equality between function values has changed. Now, a function definition may not create a new value; it may reuse some previous value if there is no observable difference to the new function. Но как эта observable difference определяется - как-то не очень понятно
Вот это? Так тут же не описано что за observable difference пока конкретно не напишут мы не можем знать как именно реализация сравнивает содержимое функций а значит и не можем знать в каком случае функция будет переиспользована а в каком создана новая.
Daniil
Только с 5.2
Скорее это) В 5.2 многое переделали.
Alexey
Вот это? Так тут же не описано что за observable difference пока конкретно не напишут мы не можем знать как именно реализация сравнивает содержимое функций а значит и не можем знать в каком случае функция будет переиспользована а в каком создана новая.
Так тут написано как раз наоборот - что больше нельзя утверждать что будет создана новая функция каждый раз t={}; for i=1,10 do t[function().....end] = i end Такой код приведет к неопределенному результату начиная с 5.2
Igor
Ох, использовать функции как ключи для таблицы... Да такого даже мой больной разум ещё ни разу не додумывался😅
Aydar
Так тут написано как раз наоборот - что больше нельзя утверждать что будет создана новая функция каждый раз t={}; for i=1,10 do t[function().....end] = i end Такой код приведет к неопределенному результату начиная с 5.2
А я что написал? Просто поведение то именно неопределенное - реализация может создать новую функцию а может не создать, но полагаться на то что не создаст нельзя.
Daniil
Ну изначально вопрос стоял не об использовании уникального указателя, а о том, как писать так, чтобы лишнего не плодить. Ответ: начиная с 5.2 можно не париться о том как писать и выносить ли локальные функции))
Alexey
Думаю, им просто было лень в этом месте писать про зависимость от замыкания)
local s = 'hello' for i=1,10 do t[i] = function()print(s)end Как бы есть явное upvalue , но вроде и не важно.
abc
привет! недавно начал изучать lua, подскажите пожалуйста как из этой таблицы вывести возраст и имя студента с наивысшим performance ['Alex'] = { ['age'] = 18, ['perfomance'] = 3, ['course'] = 1 }, ['David'] = {['age'] = 24, ['perfomance'] = 2, ['course'] = 5 }, ['Ivan'] = { ['age'] = 20, ['perfomance'] = 5, ['course'] = 3 } сделал так, но в конце выдает первый подошедший age :( for key, value in pairs(students) do for key2, value2 in pairs(value) do if (key2 == 'perfomance') then perf = value2 elseif(key2 == 'age') then age = value2 end end if (perf >= max) then max = perf name = key end end
Snusmumriken
Ох, использовать функции как ключи для таблицы... Да такого даже мой больной разум ещё ни разу не додумывался😅
Это нормальная практика. А ещё использовать таблицы и cdata как ключи, очень удобно: function server:accept() local sock = self.sock:accept() while sock do self.clients[sock] = client:new(sock) sock = self.sock:accept() end end function server:update() for sock, client in pairs(self.clients) do ... if something_is_bad then client:close() self.clients[sock] = nil end end end
Igor
Ну таблицы и cdata и я использую, это реально полезно
Igor
А вот зачем идентифицировать через функци, тут я применения найти не могу
mva
Множество уникальных действий например
и как к ним потом без итерирования по всей таблице доступ получать? :)
mva
(если функция возвращает разные значения)
mva
впрочем, снус привёл пример не того
Igor
Множество уникальных действий например
Луа явно не для этой задаяи сделан, если уж решать её таким образом.
mva
использовать результат функции - ничего страшного, в теории. А вот использовать в качестве ключа определение функции - странновато :)
Igor
Именно
🐅🤦‍♂️
mva
https://codeberg.org/jouni/mpv_sponsorblock_minimal/src/branch/master/sponsorblock_minimal.lua#L14
mva
да что ж такое-то
mva
что ж они все говнокодеры-то такие
Джифорсович
что ж они все говнокодеры-то такие
Занятная статистика - из неговнокодеров большинство токсики
Джифорсович
Из говнокодеров - большинство ленивые зумеры
Джифорсович
Мало кто хочет вникать и постигать дзен, а то еще задротом обзовут (нет, мне правда плевать, как там кто меня обзывает)
Джифорсович
> а то еще задротом обзовут Обычно пофигу же, напротив а ля комплимент.
Ну щас, во время популяризации тиктокеров 5го разряда - да, комплимент)
Джифорсович
Некоторым подружкам даже нравится, что задротишь <your_language_here>, мол не каждый умеет
Snusmumriken
Да не, в любом случае, если тебя обозвали задротом — это может означать в большинстве случаев только твою железную жопу и хорошие мозги в области.