Size: a a a

2020 October 26

EV

Eduard Voronkin in pro.lua
ну так. если я для каждого lua_State* сделаю pushlightuserdata, разве я не смогу потом её же достать?
источник

S

Snusmumriken in pro.lua
Это тоже можно. Например, замапать глобально какую-нибудь из юзердат в переменную, потом вытаскивать эту переменную lua_getglobal(L, "myvar");.
источник

AZ

Aydar Zarifullin in pro.lua
Александр Караев
если я правильно понял, вопрос был не в прокидывании userdata в луа, а в сопоставлении каждому lua_State* какой-то своей юзердаты
Тогда лучше создать структуру обёртку в которой хранить два принтера на луастейт и на "юзердату" разве нет?
источник

S

Snusmumriken in pro.lua
Если не хочется палить её — есть альтернативные варианты.
Например, замапать нормальную юзердату в луастейт, потом получить на неё ссылку
int ptr = lua_ref(L, -1);, и убрать из стека.
Она будет храниться в луёвом реестре, и не будет удаляться сборкой мусора потому что есть ссылка.
Получать обратно в какой-нибудь функции — lua_getref(L, ptr);,
удалить ссылку и очистить юзердату — lua_unref(L, ptr);.
источник

S

Snusmumriken in pro.lua
Доступ к ней из луа можно получить через debug-либу, там есть список всех луёвых объектов в т.ч. тех которые не видны из _G, но это для профессионалов ))
источник

EV

Eduard Voronkin in pro.lua
из луа доступ получать не нужно, нужно грубо говоря при создании luaState замапить данные, и потом, когда луа зовет luaCFunction - достать их
источник

S

Snusmumriken in pro.lua
Ну вот, пили юзердату и сохраняй у себя ссылку на неё(lua_ref), когда луа зовёт функцию — вытаскивай по этой ссылке данные (lua_getref). Луёвый пользователь при этом ни о чём не знает.
источник

S

Snusmumriken in pro.lua
Но по мне, в таком случае проще не заниматься чем-то подобным, а сохранить эти данные рядом:
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;
}

Раз не планируется взаимодействие луа и этих данных, может ну эти лишние провешивания одного в другое?
источник

EV

Eduard Voronkin in pro.lua
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;
}

Раз не планируется взаимодействие луа и этих данных, может ну эти лишние провешивания одного в другое?
да, это наверное самый адекватный вариант
источник
2020 October 27

DK

Dmitriy Koltsov in pro.lua
Добрый день!
Подскажите, как можно захачить LuaJIT, чтобы для сравнения строк использовать кастомный collation? Например, utf8_unicode_ci
источник

S

Snusmumriken in pro.lua
Написать функцию
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

Всё, теперь все строки в луа сравниваются по твоей методике.
источник

IN

Ivan Novikov in pro.lua
Ок
источник

DK

Dmitriy Koltsov in pro.lua
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

Всё, теперь все строки в луа сравниваются по твоей методике.
Спасибо!
источник
2020 October 28

S

Snusmumriken in pro.lua
Dmitriy Koltsov
Спасибо!
Да, ты тут хочешь сравнивать в луа нормализованные юникодные строки? Просто это не очень рационально потому что меняется поведение стандартных вещей и замедляется процесс сравнения того что должно быть сравнено прямо по байтам (обычное сравнение луёв это даже не strcmp, а сравнение двух int-указателей на строки в стрингбуфере, что имеет сложность O(1)), лично я бы вообще цапанул нормализатор откуда-нибудь, и проверял бы примерно как
if uni.decomp(foo) == uni.decomp(bar) then
 ...
end
источник
2020 October 29

5

57 69 6e 74 65 72 20 in pro.lua
Здравствуйте,товарищи!
Можете,пожалуйста, рассказать про процесс установки граф. библиотеки iuplua, в случае,если я пользуюсь ZeroBrane Studio?
источник
2020 October 31

RS

Roman Silin in pro.lua
Привет. Субботний творческий вопрос. Как на Lua можно -извратиться- реализовать протоколо-ориентированное программирование (Protocol Oriented Programming)?
источник

S

Snusmumriken in pro.lua
Это очень интересный вопрос!
(пошёл гуглить POP)
источник

S

Snusmumriken in pro.lua
Ну в целом, оно имхо выглядит как перегруженные mixin'ы. С требованием явного разрешения этих перегрузок.
источник

RS

Roman Silin in pro.lua
Подход когда ты пишешь интерфейс и работаешь непосредственно с ним, а за ним может быть любой объект, лишь бы он поддерживал этот интерфейс.

Mixin получается когда в языке есть возможность написать еще и "дефолтную" реализацию протокола, и она будет использована если объект не реализовал какую-то его часть или полностью. Таким образом да, если написать всю дефолтнубю реализацию протокола, можно превратить протокол в mixin подключая его к чему угодно.
источник

S

Snusmumriken in pro.lua
Меня в целом немножко упарывает, как эти умные ребята придумывают новые натуральные языки.
"Тэкс, а давайте наш механизм будет таким же как вот этот, но без вот этого, придумаем десять новых слов как описать всё то же самое но без вот этого" ))
источник