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
выдаст вот такой искомый мной выхлоп
Totiks
на работе завтра проверю с картинкой как, у меня как раз веб версия на работе
Hello, World! 🎄
Koto
Ребят, всем дрась!
Я помню как мы вместе смогли до меня донести фабрики итераторов, как они работают и вообще. Искреннее вам спасибо!
Но тут возник вопрос по силе таблиц для GC: когда мы пишем метатаблицу, мы можем определить силу ключей или значений для сборщика. Как это в принципе понять? Как я грубо понимаю работу сборщика: сборщик мусора запускается, проверяет объекты, их взаимосвязь и если какой-то из элементов используется либо по далеким ссылкам, либо непосредственно, в видимых областях, сборщик его не трогает. Если объект болтается без упоминаний, и не используется и не удерживается никем, сборщик его закрывает. А режимы силы как работают? Если стоит сила ключа, то сборщик проверяет нет ли в других местах обращения по ключу к нашей таблице, но не смотрит на значения из нее, а если сила в значениях, то он смотрит на значения таким же образом? Или я что-то неправильно понимаю?
слабые ключи и слабые значения НЕ СЧИТАЮТСЯ за "использование" объекта, если других использований нет ~ будет удалён из памяти
Aqendo
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 лично мне не очень нравится.
Денис
Денис
А вот что знакомый нашел
Денис
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.
Денис
Денис
Просто искать такое на MSDN уже нет смысла. В данном случае спасает, что есть документация.
Денис
Snusmumriken
Пересаживайся на жыт, тут печеньки
Lucky
Зацените гнума https://sillycross.github.io/2022/11/22/2022-11-22/
Денис
Ребят, не совсем вопрос по Lua, но он несколько связан с LuaRocks. Просто у кого ни спрашиваю, ни у кого такого нет.
Git категорически отказывается подключаться к GitHub по протоколу git. По HttPS ему норм, а вот по git отваливается по таймауту. Отсюда LuaRocks не желает клонить репозитории для сборки по rockspec… У кого такое же было когда-нибудь?
Snusmumriken
Денис
Timur
WDMR
слишком смешное имя для человiка
Snusmumriken
Аватарка сегодняшняя, просто бан )
Dmitriy
Всем привет, подскажите пожалуйста, почитал про функцию сплит, пытаюсь использовать - а он мне выдает, что такой нет
Dmitriy
http://lua-users.org/wiki/SplitJoin
Dmitriy
https://replit.com/@DmitriiBatin/LUATRY#main.lua
Dmitriy
А, блин, точно. Дочитал
Dmitriy
Спасибо
Snusmumriken
Это не самый оптимизированный варик, но под пивас сойдёт. Пока ты не дёргаешь её сто тыщ раз в секунду там где это критично.
Dmitriy
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
Например что-то такое.
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
Dmitriy
длинные - это более 2000 символов?
Snusmumriken
100-200
Snusmumriken
Dmitriy
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.
Dmitriy
Кароч, лайфхак.
Каждая операция ".." создаёт новую строку.
То есть, у тебя буквально создаётся N строчек, постоянно увеличивающейся длины:
"a", "ab", "abc", "abcd" и так далее, И все они не нужны, тут же выкидываются чтобы тут же снова создаться и снова выкинуться, пока не появится один конечный результат. Притом все эти строчки жрут память и требуют сборки мусора.
table.concat на сишной стороне сразу склеивает все значения таблички однократно размечая под них память. Тем более что у тебя уже есть табличка packet.
аааа, понятно - и получается, что каждые пару выкинутых строк потом еще сборщик мусора подключается и тоже начинает жрать ресурсы подчищая за мной
Hello, World! 🎄
Кароч, лайфхак.
Каждая операция ".." создаёт новую строку.
То есть, у тебя буквально создаётся N строчек, постоянно увеличивающейся длины:
"a", "ab", "abc", "abcd" и так далее, И все они не нужны, тут же выкидываются чтобы тут же снова создаться и снова выкинуться, пока не появится один конечный результат. Притом все эти строчки жрут память и требуют сборки мусора.
table.concat на сишной стороне сразу склеивает все значения таблички однократно размечая под них память. Тем более что у тебя уже есть табличка packet.
.. -> Выделяет память под новую строку, копирует старую + новую часть и освобождает память из-под старой строки?
Hello, World! 🎄
Snusmumriken
Да-да-да, массовые операции со строчками желательно делать на сишной стороне или через table.concat.
Snusmumriken
То есть в тех случаях, когда накладные расходы на ".." начинают перевешивать расходы на табличку. В целом ".." сильно быстрее concat'а, поэтому при небольших и одноразовых склейках ".." предпочтительнее.
Snusmumriken
Жесть капитан активирован и не останавливается )
Dmitriy
Спасибо за полезную информацию - выписал себе, что почитать)
Dmitriy