Ruslan
нигде
Я хотел это процитировать (где про порог говорил)
🌗
а, ну хотя если речь о референсном луа, то там документация наверное полезна
Ruslan
Благодарю за ответы!
🌗
скрипткидди дай б-г плейн скрипт поймут, а с байткодным они ничего не сделают
кто эти ваши скрипткидди и как часто приходится анализировать байткод
🌗
листеры что видел в публичном доступе научились ломать, как и декомпиляторы
Igor
кто эти ваши скрипткидди и как часто приходится анализировать байткод
Скрипткидди - школьник, считающий себя ниибаца программистом, который по факту умеет только всякую хрень по туториалам делать, а сам из себя нифига не представляет
🌗
Lucky
На луях https://www.reddit.com/r/INSTEADEngine/comments/yelkob/welcome_to_rain/
Dmitry
Есть только два типа людей.
Eduard
Подскажите, есть ли в луа возможность написать функцию, которая принимает произвольное кол-во аргументов? Например, в питоне это можно сделать через *args в параметрах функции, в джсе через рест параметры ...params. Но как сделать то же самое в луа?
🌗
function foo(...) local args = {...} —code end
🌗
все аргументы будут в таблице args
Eduard
спасибо
Александр
А ещё так: function f(tbl) for i, v in ipairs(tbl) print(v) end end f{"1", 2, 3}
mva
А ещё так: function f(tbl) for i, v in ipairs(tbl) print(v) end end f{"1", 2, 3}
фактически, тут один параметр и это не совсем то, но иногда так бывает удобнее, да
Александр
фактически, тут один параметр и это не совсем то, но иногда так бывает удобнее, да
пмсм так - очень удобно, ибо ... в любом случае придётся преобразовывать или пробрасывать дальше, а в случае с таблицей и множество аргументов и именованные параметры можно передать. А то как оно внутри в случае луа не так важно.
Snusmumriken
У конструкции {...} есть проблемы с nil-значениями, а ещё они создают лишнюю таблицу. Для этого есть функция select, которая превосходна.
Snusmumriken
Ну там: function concat(separator, ...) local result = {} for i = 1, select("#", ...) do local item = select(i, ...) result[i] = tostring(item) end return table.concat(result, separator) end function summ(...) local result = 0 for i = 1, select("#", ...) do result = result + select(i, ...) end return result end И select в принципе быстрее работает чем операции с табличками. Но она возвращает сразу все элементы начиная с i, поэтому пропихивать её результат сразу в функции не всегда гуд.
mva
@HighlyLikelyUser не честно! я на секунду задержался прочитать (вдруг всё-таки не спам) уже протыкав галки, а ты опередил :)
Alexandra
Всем привет! Вакансия для чистых луашников) Компания Bercut Ltd. – более 27 лет создаем и внедряем бизнес-продукты и кастомизированные решения для операторов связи по всему миру. Офис в Санкт-Петербурге, возможность удаленной работы из любого уголка нашей необъятной, аккредитованная компания со всеми актуальными в нынешнее время профитами, оклад от 150-200K руб. net плюс ежеквартальные премии (50% от оклада). Сейчас мы в поисках Software developer (Lua) (более подробно https://spb.hh.ru/vacancy/71215158) Задача совместно с командой R&D сделать ключевой продукт компании (биллинг) максимально современным, быстрым и надежным. Основное: 🔹разработка высоконагруженных сервисов распределенной биллинговой системы (объектные модели и скрипты на Lua) 🔹Tarantool 🔹проектирование интерфейсов SOAP/REST Писать в личку @Ant_Alexandra - расскажу подробно и честно про команду, задачи, ожидания и перспективы) Пост согласован с @HighlyLikelyUser с большим пиететом к луа-разработчикам😉
mva
тарантул для билинга? интересные нынче биллинги пошли :)
Mike_Went
тарантул для билинга? интересные нынче биллинги пошли :)
да вроде нормально. видел биллинг на чистом луа.
Tverd
тарантул для билинга? интересные нынче биллинги пошли :)
А чего нет? Тарантул в качестве кэша + бизнес логика
Snusmumriken
тарантул для билинга? интересные нынче биллинги пошли :)
А в чём принципиальная разница? Ты про отказоустойчивость или чего?
Highly Likely
тарантул для билинга? интересные нынче биллинги пошли :)
А что не так с Тарантулом? Довольно популярное решение, имхо
Yaroslav
У меня база с профилями абонентов в тарантуле, логика на луа
Snusmumriken
У меня на работке биллинг на луях же, вместе с остальной бизнес-логикой, правда без тарантула )
Илья
тарантул для билинга? интересные нынче биллинги пошли :)
В МРГ (который нынче ВК) водится сильно больше одного биллинга на тарантуле
Илья
Почему бы собственно и нет
Snusmumriken
Я совершенно внезапно вспомнил косячок скриптиков (и любых яп, не имеющих класса "валюта", учитывающего нижеуказанные факторы) в биллинге. Точнее даже не в биллинге, а при дёргании множества крошечных операций, типа "применяем цепочку модификаций +5% -5% +5%" или "итеративно преобразуем валюты" или "суммируем новые цены после преобразований вместо первоначального суммирования" — от гуляний мантиссы может внезапно выясниться, что конечная циферка после преобразований на несколько центов выше или ниже требуемого, а при умножениях (оптовые закупки/продажи) это суммарно может вылиться в гуляющие туда-сюда тысячи баксов. Но это в целом относится только к "серьёзному" биллингу вроде переусложнённых торговых площадок или брокерского по. Подобные ошибки, кстати, часто маскируют той или иной "комиссией" при платеже — человек видит, мол "с вас комиссия", но не подсчитывает её полностью. И у тарантула по моему есть нормальные тулзы для работы с валютами.
Anton
Это проблема не языков/бд, а исключительно хренового проектирования. Когда на этапе разработки архитектуры закладывают единственную валюту, точность два знака - а потом начинают прикручивать сбоку другие через костыли - вот тогда мантисса начинает плавать.
Snusmumriken
Ну в общем и целом да, конечно. Просто если пользоваться длинной арифметикой а то и вовсе настоящими дробями — проблемы как бы и нет, и можно накручивать что угодно )
Snusmumriken
Надо будет в качестве развлечения накатать на луях класс работы с выражениями, мол, число, с которым проводим тонну операций, сохраняем все операции в выражение и выдаём результат по необходимости. С подстановкой других выражений, офк.
fgntfg
Это вы еще дебет с кредитом не путали
WDMR
а что если хранить валюту в integer в копейках?
WDMR
мантисы не будет
Денис
Я совершенно внезапно вспомнил косячок скриптиков (и любых яп, не имеющих класса "валюта", учитывающего нижеуказанные факторы) в биллинге. Точнее даже не в биллинге, а при дёргании множества крошечных операций, типа "применяем цепочку модификаций +5% -5% +5%" или "итеративно преобразуем валюты" или "суммируем новые цены после преобразований вместо первоначального суммирования" — от гуляний мантиссы может внезапно выясниться, что конечная циферка после преобразований на несколько центов выше или ниже требуемого, а при умножениях (оптовые закупки/продажи) это суммарно может вылиться в гуляющие туда-сюда тысячи баксов. Но это в целом относится только к "серьёзному" биллингу вроде переусложнённых торговых площадок или брокерского по. Подобные ошибки, кстати, часто маскируют той или иной "комиссией" при платеже — человек видит, мол "с вас комиссия", но не подсчитывает её полностью. И у тарантула по моему есть нормальные тулзы для работы с валютами.
Я подозреваю, что там играет свою роль Float. Я с этим столкнулся, когда учил питон недавно и переписывал одну программку, которую писал на луях. В Луа оказалось, что Number немного поумнее - тут если округлять, то все работает нормально. На питоне же Float врет безбожно. Но там есть decimal, он как раз помогает нормально математику. С ним только у меня и получилось.
Денис
Надо правда еще сказать, что функцию округления в луе я брал с Coderoad, т.е., она не родная.
Snusmumriken
а что если хранить валюту в integer в копейках?
Такой вариант тоже есть в целом, но просто мне нравится затея оформить накопитель матвыражения а ля x = (n(10) + 20) / 50 y = x + n(y + 20) / 25 print(y:solve()) Примерно такая ерунда. Типа, n(10) начинает накапливать все остальные операции, под конец сокращает всё что сокращаемо и выводит результат, а ля решатель уравнений. И мол всякие дроби вида 1/3 остаются дробью до конечного вычисления результатов.
Lucky
https://iquilezles.org/articles/floatingbar/
Lucky
Иниго тоже об эту тему ум морщил.
Snusmumriken
Отличная идея. В реймаршерах с sdf тоже пригодится.
Оно не будет особо быстрым, суть в точности
Lucky
Оно не будет особо быстрым, суть в точности
Дык оно считается один раз по сути, дальше - по упрощёнке.
🌗
прив, не подскажете как понимать такую "фичу" референсного lua? lua 5.4.4 #{1, 2, 3, nil, 4} -> 5 luajit 2.1.0-beta3 #{1, 2, 3, nil, 4} -> 3
Artem
luajit основана вроде бы на 5.1
🌗
поведение оператора "#" различается между версиями?
🌗
или у референсного lua иное мнение о sequence
Artem
https://habr.com/ru/company/vk/blog/493642/
mva
поведение оператора "#" различается между версиями?
вообще, даже сейчас 5.1 возвращает 5, но то ли у меня ложные оспоминания, то ли я помню, что когда-то он тоже на "дырках" переставал считать
🌗
получил 3 только на 5.0.5
mva
а вообще там в статье на хабре есть объяснение
mva
начинается в блоке про "длина таблицы table.getn"
mva
> LuaJIT ищет в таблице "границу". Если в массиве есть пропущенные значения, а значит границ существует несколько, то LuaJIT в зависимости от обстоятельств может найти любую из них, и будет прав:
Luсky
Ну, за дырки в таблице надо погромиста бить по шевелюре
Snusmumriken
Also there some issues with holes
Snusmumriken
table.len will iterate array until first hole. # will use binary search. ipairs iterates until first hole. pairs does not care about.
Snusmumriken
So t[#t + 1] = n will insert in "almost random hole" or end of array. t[table.len(t) + 1] = n will insert in first hole. table.insert uses binary search like #.
Snusmumriken
So it's just little inconsistency between table.len and #, but both have uses. And # is much faster on straight arrays without holes, so use table.len if you work with hole arrays and need to check first hole.
Snusmumriken
прив, не подскажете как понимать такую "фичу" референсного lua? lua 5.4.4 #{1, 2, 3, nil, 4} -> 5 luajit 2.1.0-beta3 #{1, 2, 3, nil, 4} -> 3
Почему же в одной версии вернуло 5, а в другой вернуло 3? Потому что интерпретатор во-первых можно настраивать, например при разметке массива можно взять разный оверхед таблички "на будущее" — и бинарный поиск будет начинаться с другого места. Во-вторых, массивы с дырками, разумеется, недетерминированы ) # это всегда бинарный поиск, вопрос — откуда он начинается.
Bolt
Если система счисления десятичная)
Snusmumriken
Если система счисления десятичная)
Она в компе везде двоичная, за случаями парсинга строчек
mva
вы продаёте рыбов?
Денис
Ребят, всем дрась! Я помню как мы вместе смогли до меня донести фабрики итераторов, как они работают и вообще. Искреннее вам спасибо! Но тут возник вопрос по силе таблиц для GC: когда мы пишем метатаблицу, мы можем определить силу ключей или значений для сборщика. Как это в принципе понять? Как я грубо понимаю работу сборщика: сборщик мусора запускается, проверяет объекты, их взаимосвязь и если какой-то из элементов используется либо по далеким ссылкам, либо непосредственно, в видимых областях, сборщик его не трогает. Если объект болтается без упоминаний, и не используется и не удерживается никем, сборщик его закрывает. А режимы силы как работают? Если стоит сила ключа, то сборщик проверяет нет ли в других местах обращения по ключу к нашей таблице, но не смотрит на значения из нее, а если сила в значениях, то он смотрит на значения таким же образом? Или я что-то неправильно понимаю?
Александра🌿
вы продаёте рыбов?
Почему вы так подумали?
UtoECat
Ребят, всем дрась! Я помню как мы вместе смогли до меня донести фабрики итераторов, как они работают и вообще. Искреннее вам спасибо! Но тут возник вопрос по силе таблиц для GC: когда мы пишем метатаблицу, мы можем определить силу ключей или значений для сборщика. Как это в принципе понять? Как я грубо понимаю работу сборщика: сборщик мусора запускается, проверяет объекты, их взаимосвязь и если какой-то из элементов используется либо по далеким ссылкам, либо непосредственно, в видимых областях, сборщик его не трогает. Если объект болтается без упоминаний, и не используется и не удерживается никем, сборщик его закрывает. А режимы силы как работают? Если стоит сила ключа, то сборщик проверяет нет ли в других местах обращения по ключу к нашей таблице, но не смотрит на значения из нее, а если сила в значениях, то он смотрит на значения таким же образом? Или я что-то неправильно понимаю?
UtoECat
Ребят, всем дрась! Я помню как мы вместе смогли до меня донести фабрики итераторов, как они работают и вообще. Искреннее вам спасибо! Но тут возник вопрос по силе таблиц для GC: когда мы пишем метатаблицу, мы можем определить силу ключей или значений для сборщика. Как это в принципе понять? Как я грубо понимаю работу сборщика: сборщик мусора запускается, проверяет объекты, их взаимосвязь и если какой-то из элементов используется либо по далеким ссылкам, либо непосредственно, в видимых областях, сборщик его не трогает. Если объект болтается без упоминаний, и не используется и не удерживается никем, сборщик его закрывает. А режимы силы как работают? Если стоит сила ключа, то сборщик проверяет нет ли в других местах обращения по ключу к нашей таблице, но не смотрит на значения из нее, а если сила в значениях, то он смотрит на значения таким же образом? Или я что-то неправильно понимаю?
И режимы таблицы не в силу ключа/значения, а в слабость :)
Totiks
Доброго всем! Подскажите пожалуйста вот в lua на пример есть такое print [[************** * * * * * * * *]] есть ли нечто такое для basic?
fgntfg
Печатать строки в basic? Кажется PRINT
Totiks
print то понятно
Totiks
мне нужно выдать на print сразу отформатированую таблицу, как в примере выше
fgntfg
в каком языке?
fgntfg
в любом случае, надо написать какую-то функцию для рисования каждой строки
fgntfg
или не париться и бахнуть \t как разделители