Totiks
в lua можно так print [[******************* ******************* ******************* *******************]] и принт выведет это ровно так же как я напечатал, мне хочется такого же и для freebasic
Totiks
но по ходу там своё форматирование строк, по ходу только через запятые
Totiks
freebasic выбрал потому что язык компилируемый и такой же простой
Aydar
но по ходу там своё форматирование строк, по ходу только через запятые
Если нужно именно литералы форматировать https://www.freebasic.net/forum/viewtopic.php?t=16510 то есть строки написанные через _ конкатенируются но переносы строк надо вручную добавлять Если нужно форматировать строки можно использовать https://www.freebasic.net/wiki/KeyPgPrintusing (аналог string.format)
Totiks
спасибо я понял, но я по ходу нашел то что искал
Totiks
это можно получить через специальный табулятор spc(), не так просто конечно и красиво как в lua , но уже что то, выглядит пример вот так dim as integer a,a1,a2 a=10 a1=11 a2=12 print"***************************" print "*";spc(2);a;spc(2);"*";spc(2);a1;spc(2);"*";spc(2);spc(2);a2;spc(2);"*"
Totiks
выдаст вот такой искомый мной выхлоп
WDMR
выдаст вот такой искомый мной выхлоп
чот веб версия эту картинку не показывеет. У всех так?
Totiks
на работе завтра проверю с картинкой как, у меня как раз веб версия на работе
Koto
Ребят, всем дрась! Я помню как мы вместе смогли до меня донести фабрики итераторов, как они работают и вообще. Искреннее вам спасибо! Но тут возник вопрос по силе таблиц для GC: когда мы пишем метатаблицу, мы можем определить силу ключей или значений для сборщика. Как это в принципе понять? Как я грубо понимаю работу сборщика: сборщик мусора запускается, проверяет объекты, их взаимосвязь и если какой-то из элементов используется либо по далеким ссылкам, либо непосредственно, в видимых областях, сборщик его не трогает. Если объект болтается без упоминаний, и не используется и не удерживается никем, сборщик его закрывает. А режимы силы как работают? Если стоит сила ключа, то сборщик проверяет нет ли в других местах обращения по ключу к нашей таблице, но не смотрит на значения из нее, а если сила в значениях, то он смотрит на значения таким же образом? Или я что-то неправильно понимаю?
слабые ключи и слабые значения НЕ СЧИТАЮТСЯ за "использование" объекта, если других использований нет ~ будет удалён из памяти
Snusmumriken
Ребят, всем дрась! Я помню как мы вместе смогли до меня донести фабрики итераторов, как они работают и вообще. Искреннее вам спасибо! Но тут возник вопрос по силе таблиц для GC: когда мы пишем метатаблицу, мы можем определить силу ключей или значений для сборщика. Как это в принципе понять? Как я грубо понимаю работу сборщика: сборщик мусора запускается, проверяет объекты, их взаимосвязь и если какой-то из элементов используется либо по далеким ссылкам, либо непосредственно, в видимых областях, сборщик его не трогает. Если объект болтается без упоминаний, и не используется и не удерживается никем, сборщик его закрывает. А режимы силы как работают? Если стоит сила ключа, то сборщик проверяет нет ли в других местах обращения по ключу к нашей таблице, но не смотрит на значения из нее, а если сила в значениях, то он смотрит на значения таким же образом? Или я что-то неправильно понимаю?
Читал? Тут есть примерчики https://habr.com/ru/post/346892/
Snusmumriken
https://habr.com/ru/post/163679/
Денис
Господа, не знаю открою ли америку, но вот что нечаянно нашел: https://quik2dde.ru/viewtopic.php?id=78 Тут упоминается какой-то мод Lua, но я все кастомные функции прочекал, и они в оригинальной либе таки есть!
mva
🤮
Snusmumriken
🤮
Соглы, то что расположено на квик форуме — противненько, но в целом либа норм для скриптования гуёв на венде.
Snusmumriken
Считай что можно сделать что-то похожее на ahk на луях, особенно если чутка расширить функционал на ловлю-отправку событий мыши-клавы.
Snusmumriken
Кстати надо будет заняться на досуге. На чистом winapi можно много чего накрутить прикольного, а ahk лично мне не очень нравится.
Денис
Кстати надо будет заняться на досуге. На чистом winapi можно много чего накрутить прикольного, а ahk лично мне не очень нравится.
У меня была мысля прикрутить AU3 через Алиена, там благо немного писать пришлось бы. Мы в свое время под PB его прикручивали.
Денис
А вот что знакомый нашел
Денис
https://stevedonovan.github.io/winapi/api.html
Денис
Только мы пока понять не можем где ее собирать
Денис
Денис
Денис
Таки мы его собрали!
Денис
В архиве есть примеры. Приятно удивило, что хендлы представлены в виде юзердаты с метатаблицами. Неприятно - что все функции переведены в snake case.
Snusmumriken
Юзердата с метатаблицами имеет как преимущества так и недостатки. В целом норм.
Snusmumriken
Неудобно сериализовать при необходимости. В целом я стараюсь обходиться без юзердат по максимуму.
Денис
А вообще, как я понял, это нужно воспринимать не как копия WINAPI. Скорее всего, как обертку над ней, поскольку тут встречаются уж совсем не винапишные извраты. Например, создание пайпов и мьютексов.
Snusmumriken
Это винапишные извраты
Денис
Неудобно сериализовать при необходимости. В целом я стараюсь обходиться без юзердат по максимуму.
Ну, если эта юзердата требуется только в твоей либе, и ты сам знаешь/можешь кастовать туда-сюда.
Денис
Это винапишные извраты
Так вот я и не помню, чтобы там было что-то вроде p = winapi.pipe() там обычно p = winapi.CreatePipe (в нашем случае p = winapi.create_pipe())
Snusmumriken
Не важно как назвали функцию, важно что винапи её поддерживает, внутри там CreatePipe.
Денис
Не важно как назвали функцию, важно что винапи её поддерживает, внутри там CreatePipe.
Не, ну так-то и корыто в виде лодки поплывет! 😀 Кто же спорит-то!
Денис
Просто искать такое на MSDN уже нет смысла. В данном случае спасает, что есть документация.
Snusmumriken
Просто искать такое на MSDN уже нет смысла. В данном случае спасает, что есть документация.
Вообще, есть такая замечательная штука: https://luapower.com/ И тут есть модули для работы winapi, очень объёмные, и всё на луажыте, т.е. пересобирать не нужно, плюс в качестве фишки utf8 по дефолту.
Snusmumriken
Пересаживайся на жыт, тут печеньки
Lucky
Зацените гнума https://sillycross.github.io/2022/11/22/2022-11-22/
Koto
Зацените гнума https://sillycross.github.io/2022/11/22/2022-11-22/
💥💥💥 очень сильно, так у нас действительно будет браузерная луа через васм :)
Денис
Ребят, не совсем вопрос по Lua, но он несколько связан с LuaRocks. Просто у кого ни спрашиваю, ни у кого такого нет. Git категорически отказывается подключаться к GitHub по протоколу git. По HttPS ему норм, а вот по git отваливается по таймауту. Отсюда LuaRocks не желает клонить репозитории для сборки по rockspec… У кого такое же было когда-нибудь?
Денис
А тут какая-то стабильная чепуха, для гита ему по моему нужен пакет какой-то. Но само по себе не принципиально, разве что пакетики ставятся на крошечку медленнее.
Так а там без этого самого пакета никак! В рокспецах указан протокол git, а его явное изменение вываливает ошибку, дескать, я скочал giT-файл, а это не архив!
WDMR
слишком смешное имя для человiка
Snusmumriken
Аватарка сегодняшняя, просто бан )
Dmitriy
Всем привет, подскажите пожалуйста, почитал про функцию сплит, пытаюсь использовать - а он мне выдает, что такой нет
Dmitriy
http://lua-users.org/wiki/SplitJoin
Dmitriy
https://replit.com/@DmitriiBatin/LUATRY#main.lua
Igor
Всем привет, подскажите пожалуйста, почитал про функцию сплит, пытаюсь использовать - а он мне выдает, что такой нет
Наверное потому что её и правда нет в стандартном наборе языка. Ссылка на lua-users.org, которую ты кинул - это не ман по базовым функциям Lua, ниже ты можешь найти сами имплементации функции split.
Snusmumriken
Всем привет, подскажите пожалуйста, почитал про функцию сплит, пытаюсь использовать - а он мне выдает, что такой нет
Её и нет в стандартном наборе. Вон там пример: function string:split(sep) local sep, fields = sep or ":", {} local pattern = string.format("([^%s]+)", sep) self:gsub(pattern, function(c) fields[#fields+1] = c end) return fields end Добавляй, используй.
Dmitriy
А, блин, точно. Дочитал
Dmitriy
Спасибо
Snusmumriken
Это не самый оптимизированный варик, но под пивас сойдёт. Пока ты не дёргаешь её сто тыщ раз в секунду там где это критично.
Snusmumriken
М?
Dmitriy
Вообще-то достаточно активно, а девайс тупенький. У вас имеется в заначке более оптимальный?
Snusmumriken
Например что-то такое. function string:split(sep) sep = sep or "," local out = {} local a, b, i, _ = 1, #self, 1 _, b = self:find(sep) while a and b do out[i] = self:sub(a, b - 1) a, i = b + 1, i + 1 _, b = self:find(sep, a) end out[i] = self:sub(a) return out end
Dmitriy
а я могу буффер принятых символов (packet) - по сути таблица хексов сразу преобразовать в строку? типа string.char(packet) или по-любому писать функцию типа str1="" for i=0, #(packet) do str1 = str1..string.char(packet[i]) end
Snusmumriken
а я могу буффер принятых символов (packet) - по сути таблица хексов сразу преобразовать в строку? типа string.char(packet) или по-любому писать функцию типа str1="" for i=0, #(packet) do str1 = str1..string.char(packet[i]) end
В зависимости от длины, можно out = string.char((unpack or table.unpack)(packet)) Но не советую так делать с сильно длинными табличками, условно больше 100-200 элементов.
Dmitriy
длинные - это более 2000 символов?
Snusmumriken
100-200
Snusmumriken
а я могу буффер принятых символов (packet) - по сути таблица хексов сразу преобразовать в строку? типа string.char(packet) или по-любому писать функцию типа str1="" for i=0, #(packet) do str1 = str1..string.char(packet[i]) end
Вот этот вариант кстати дико медленный и жрёт миллиарды памяти. Вот этот — не жрёт: local char = string.char for i = 1, #packet do packet[i] = char(packet[i]) end msg = table.concat(packet)
Dmitriy
щас испытаю
Snusmumriken
а я могу буффер принятых символов (packet) - по сути таблица хексов сразу преобразовать в строку? типа string.char(packet) или по-любому писать функцию типа str1="" for i=0, #(packet) do str1 = str1..string.char(packet[i]) end
Кароч, лайфхак. Каждая операция ".." создаёт новую строку. То есть, у тебя буквально создаётся N строчек, постоянно увеличивающейся длины: "a", "ab", "abc", "abcd" и так далее, И все они не нужны, тут же выкидываются чтобы тут же снова создаться и снова выкинуться, пока не появится один конечный результат. Притом все эти строчки жрут память и требуют сборки мусора. table.concat на сишной стороне сразу склеивает все значения таблички однократно размечая под них память. Тем более что у тебя уже есть табличка packet.
Snusmumriken
аааа, понятно - и получается, что каждые пару выкинутых строк потом еще сборщик мусора подключается и тоже начинает жрать ресурсы подчищая за мной
Да. И под каждую требуется и выделить память, и тут же собрать её. Проблема не столько в сборщике мусора сколько в том, что тут требуется плодить и тут же очищать эту память. Притом когда ты делаешь string.char память под символ тоже выделяется, но их ограниченное количество (256) и они все однобайтовые. Они тоже соберутся мусорщиком, но дубликаты строчек не будут дублировать потребление памяти из-за наличия в луях механизма стрингбуфера.
Snusmumriken
.. -> Выделяет память под новую строку, копирует старую + новую часть и освобождает память из-под старой строки?
Освободит память из под старой если она ушла из области видимости. В цикле каждая итерация имеет свою видимость, плюс идут перетирания str = str .. char, то что перетёрто будет очищено позже если нет дубликатов.
Snusmumriken
Да-да-да, массовые операции со строчками желательно делать на сишной стороне или через table.concat.
Snusmumriken
То есть в тех случаях, когда накладные расходы на ".." начинают перевешивать расходы на табличку. В целом ".." сильно быстрее concat'а, поэтому при небольших и одноразовых склейках ".." предпочтительнее.
Hello, World! 🎄
Это затраты на выделение памяти под новую строчку, копирование элементов в новую область памяти, очистка предыдущей строчки
Трата времяни в пустую, тот метод что выше в разы быстрее должен работать, чем множественное сложение через .. (из-за того, что скорее всего 1 раз посчитает кол-во элементов и выделит под них память скопировав их)
Snusmumriken
Жесть капитан активирован и не останавливается )
Dmitriy
Спасибо за полезную информацию - выписал себе, что почитать)
Dmitriy