Eduard
А у меня
С -> Lua.yield
sleep(n);
С-> Lua.resume
Eduard
ну и error`a у меня никакого от lua_pcall нет. Как сказано в доке
Eduard
Lua raises an error whenever it tries to yield across an API call
Snusmumriken
У корутин такое дело, что их совсем нельзя йелдить через сишные вызовы включая pcall, который тоже сишный вызов.
Но если ты можешь, попробуй влепить https://coco.luajit.org. Или использовать luajit, там оно встроено.
Snusmumriken
Правда, coco делает корутины немного тяжелее чем были. Но это принципиально только если у нас модные функциональные техники "а давайте наплодим стотыщ короткоживущих лямбдокорутин на каждый чих".
Alexey
Nikita
Всем привет, как скомпилировать lua, при попытке это сделать, я на выходе получаю исполняемый файл для винды, но он не работает
Nikita
lyac
Nikita
а как через lua его запустить тогда?
Nikita
Спасибо
Eduard
mva
mva
если хочешь скрыть исходники, то ты этого не сделаешь
mva
на каждый хитрожопый способ сокрытия есть способ расковырять исходники обратно (вопрос лишь в потраченном времени)
Nikita
mva
не знаю что ты там пилишь, но вот лично я бы лучше поставил lua, чем запускать левые бинарники из интернетов
Nikita
Alexey
Когда то использовал патченый lbia 2
Alexey
она мне собирал gui приложение на iup с кучей библиотек (socket, sqlite, zmq и т.д)
Andrey
Всем привет. А кто нить знает лёгкий способ перекодировать все русские большие буквы в маленькие в строке utf-8 без использования таблицы из 33 индексов аля .['А']= 'а' и gsub в цикле ?
Alexey
Можно через ffi с кодами символов, если у вас используется одна-единственная кодовая таблица:)
mva
Andrey
Alexey
mva
this + ffi
Да если на один раз, то можно хоть на string.byte/string.char :)
Alexey
Alexey
А дальше уже лучше погуглить и примеры посмотреть
Andrey
C умеет полную поддержку любых кодировок ? Вот честно стараюсь держаться подальше от C
Andrey
Просто такое ощущение что бразильцам пофиг на другие языки... и на это пофиг уходит масса времени...
Andrey
Alexey
Ищите готовые модули для работы со строками, может кто-то даже бенчмарки проводил
Andrey
Andrey
Andrey
Но обидно
Andrey
На дворе 21 век и до сих пор проблемы с кодировками...
Alexey
А ещё с датами, единицами измерений, и прочими локалями
Alexey
Селяви
Andrey
Andrey
Кстати с датами как и с географией и единицами измерения особых проблем нет - все пересчитывается по формулам. А вот с кодировками беда.. Кто столько выдумал.
mva
Маркетологи
mva
Если бы не они, то как минимум половины существующих кодировок не существовало бы
Eduard
Есть ли какая-то возможность к lua_State замапить произвольные данные (void*) ?
Eduard
чтобы потом достать его в lua_CFunction
Александр
Александр
Eduard
Snusmumriken
интересно
{luasteam}Buffer — нормальная юзердата, с методами вроде ЭТОГО ПРИМЕРА. В луа пушится light userdata.
Snusmumriken
Эту лайт юзердату можно обратно послать в сишную функцию, но там уже не получится проверить её тип, просто приводишь void * к необходимому.
Александр
типа своя userdata для каждого инстанса "виртуальной машины"
Eduard
ну так. если я для каждого lua_State* сделаю pushlightuserdata, разве я не смогу потом её же достать?
Snusmumriken
Это тоже можно. Например, замапать глобально какую-нибудь из юзердат в переменную, потом вытаскивать эту переменную lua_getglobal(L, "myvar");.
Snusmumriken
Если не хочется палить её — есть альтернативные варианты.
Например, замапать нормальную юзердату в луастейт, потом получить на неё ссылку
int ptr = lua_ref(L, -1);, и убрать из стека.
Она будет храниться в луёвом реестре, и не будет удаляться сборкой мусора потому что есть ссылка.
Получать обратно в какой-нибудь функции — lua_getref(L, ptr);,
удалить ссылку и очистить юзердату — lua_unref(L, ptr);.
Snusmumriken
Доступ к ней из луа можно получить через debug-либу, там есть список всех луёвых объектов в т.ч. тех которые не видны из _G, но это для профессионалов ))
Eduard
из луа доступ получать не нужно, нужно грубо говоря при создании luaState замапить данные, и потом, когда луа зовет luaCFunction - достать их
Snusmumriken
Ну вот, пили юзердату и сохраняй у себя ссылку на неё(lua_ref), когда луа зовёт функцию — вытаскивай по этой ссылке данные (lua_getref). Луёвый пользователь при этом ни о чём не знает.
Snusmumriken
Но по мне, в таком случае проще не заниматься чем-то подобным, а сохранить эти данные рядом:
void * mydata = [..];
int lua_func_foo(lua_State * L) {
// делаем что-нибудь с mydata
return 0;
}
int main(argc argv ...){
lua_State * L = lua_newstate(...);
lua_pushcfunction(L, lua_func_foo);
lua_setglobal(L, "foo");
lua_dofile(L, ....);
return 0;
}
Раз не планируется взаимодействие луа и этих данных, может ну эти лишние провешивания одного в другое?
Eduard
Dmitriy
Добрый день!
Подскажите, как можно захачить LuaJIT, чтобы для сравнения строк использовать кастомный collation? Например, utf8_unicode_ci
Snusmumriken
Написать функцию
local str_mt = debug.getmetatable("")
function str_mt.__eq(a, b)
if utf8.len(a) ~= utf8.len(b) then
return false
end
-- подставишь любую методику сравнения
-- сишную функцию сравнения или ещё что
for i = 1, utf8.len(a) do
local a_char = utf8.sub(a, i, i)
local b_char = utf8.sub(b, i, i)
if a_char ~= b_char then
return false
end
end
return true
end
Всё, теперь все строки в луа сравниваются по твоей методике.
Artem
Ок
Dmitriy
Snusmumriken
Спасибо!
Да, ты тут хочешь сравнивать в луа нормализованные юникодные строки? Просто это не очень рационально потому что меняется поведение стандартных вещей и замедляется процесс сравнения того что должно быть сравнено прямо по байтам (обычное сравнение луёв это даже не strcmp, а сравнение двух int-указателей на строки в стрингбуфере, что имеет сложность O(1)), лично я бы вообще цапанул нормализатор откуда-нибудь, и проверял бы примерно как
if uni.decomp(foo) == uni.decomp(bar) then
...
end
Roma
Привет. Субботний творческий вопрос. Как на Lua можно -извратиться- реализовать протоколо-ориентированное программирование (Protocol Oriented Programming)?
Snusmumriken
Это очень интересный вопрос!
(пошёл гуглить POP)
Snusmumriken
Ну в целом, оно имхо выглядит как перегруженные mixin'ы. С требованием явного разрешения этих перегрузок.
Roma
Подход когда ты пишешь интерфейс и работаешь непосредственно с ним, а за ним может быть любой объект, лишь бы он поддерживал этот интерфейс.
Mixin получается когда в языке есть возможность написать еще и "дефолтную" реализацию протокола, и она будет использована если объект не реализовал какую-то его часть или полностью. Таким образом да, если написать всю дефолтнубю реализацию протокола, можно превратить протокол в mixin подключая его к чему угодно.
Snusmumriken
Меня в целом немножко упарывает, как эти умные ребята придумывают новые натуральные языки.
"Тэкс, а давайте наш механизм будет таким же как вот этот, но без вот этого, придумаем десять новых слов как описать всё то же самое но без вот этого" ))
Roma
Ну, может быть. Просто я на swift постоянно с этим работаю, чтобы интерфейсы были чистыми. И пытаюсь понять можно ли вообще от этой концепции в lua получить какой-то прок. Ничего на ум не приходит, интерфейсов то как таковых нет, таблицы и ключи, и лишь какой-нибудь emmylua пропарсит все и подскажет где какой есть интерфейс )
Roma
Типа компилятор схавает все, поэтому не применимо
Snusmumriken
Как я понимаю, в данном контексте, интерфейс это некоторое соглашение на набор полей и методов.
Типа, если два класса имеют одинаковые методы (и/или связанные с ними поля) с однотипным вводом-выводом, то у них как бы есть общий интерфейс.
Roma
Может если с emmylua обертки какие делать, таблицы с интерфейсов протокола который будут закрывать собой реальные таблицы, пробрасывать. Я как и говорил выше, все это избвращение потенциально, но любопытно.
Snusmumriken
> дисциплинирует разраба писать по полочкам
Вот это меня радует больше всего ))
По сути, основная проблема ООП в том, что его очень легко абузить так, чтобы код превращался в кашу из наследований, и хорошо если не множественных.
Основная проблема классического процедурного проганья ещё и в том, что оно даёт ну слишком много свободы, и для того чтобы структурированно писать нужно быть семи пядей во лбу, хорошо хоть у ООП нет такой проблемы.
Snusmumriken
И основной задачей новых модных методик становится сделать так, чтобы "при наших правилах не было принципиальной возможности написать криво или абузить наши правила".
Roma
Ну вот ктсати, с помощью протоколов в роли миксинов ты можешь ослабить наследование и вынести функционал "сбоку", более горизонтально )
Roma
Да, попытка придти к балансу. Чтобы и криво не было, и гибкость была.