Luсky
Snusmumriken
Если игра это поддерживает )
Вон в вовке интерфейсы на луях клепаются.
usernameak
usernameak
явно подразумевается вопрос по апи игры)
notepad++
Дратути.
Anonymous
Здравствуйте, интересует вопрос, как сделать чтобы в случайных местах в строке вставлялся символ, допустим
aaaaaaaaaaaaa -> aa.aaa.a.a.aa.aaa.a
Rostislav
символ может появляться на первом или последнем месте? несколько символов могут появляться подряд?
Wsevolod
Здравствуйте, интересует вопрос, как сделать чтобы в случайных местах в строке вставлялся символ, допустим
aaaaaaaaaaaaa -> aa.aaa.a.a.aa.aaa.a
local function rand_insert(str, count, ch)
return table.concat(setmetatable({i = 1}, {
__len = function() return #str + count end,
__index = function(t, idx)
if math.random() < count / (#str + count) then
return ch
else
local c = str:sub(t.i, t.i)
t.i = t.i + 1
return c == '' and ch or c
end
end
}))
end
local result = rand_insert('aaaaaaaaaaaaa', 6, '.')
Anonymous
Highly Likely
Anonymous
Rostislav
то есть это валидное решение aaaaaaaaaaaaa -> .aaaaaa.aa.a..a..aaa ?
Anonymous
ага
Rostislav
а новых символов сколько может появиться? или это как в примере выше должно задаваться?
Anonymous
Rostislav
даже миллион?
Anonymous
почему бы и нет :)
Rostislav
сорри, я просто сам тоже хочу это решить, я не придираюсь
Anonymous
сейчас дошло решение, вроде
через каждый символ рандомно выбирается 0,1 или 2 символа добавить
Rostislav
у меня вот так вышло
local input = "aaaaaaaaaaaaa"
local input_length = string.len(input)
local min_dots = 1
local max_dots = input_length - 1 -- just for convenience
math.randomseed(os.clock() * 1000000)
local number_of_dots = math.random(min_dots, max_dots)
local output_table = {}
for character in string.gmatch(input, ".") do table.insert(output_table, character) end
for i = 1, number_of_dots do table.insert(output_table, ".") end
for i = #output_table, 2, -1 do
local j = math.random(i)
output_table[i], output_table[j] = output_table[j], output_table[i]
end
local output = table.concat(output_table)
pprint(input .. " -> " .. output)
Snusmumriken
Ну простой вариант — что-то такое:
function trashify(str)
for i = 0, math.random(#str) do
local slice = math.random(#str)
local left, right = str:sub(0, slice - 1), str:sub(slice)
str = left .. "." .. right
end
return str
end
Snusmumriken
Правда тут есть некоторая неравномерность, потому что появляется более высокая вероятность что новая точка будет вставлена в уже имеющуюся кучу точек.
A
Добрый день. Возник вопрос по C-API (встраивание). Есть ли легальный способ напрямую читать и модифицировать память нод таблиц Lua со стороны С? Решаемая задача: приложение, в которое встроен интерпретатор Lua, снаружи получает пользовательский скрипт, являющийся плотной числодробилкой, и этот скрипт зависит от кучи переменных "среды" (контекста), выставляемых приложением. Хочется минимизировать количество копий и C-API вызовов, при этом сохранив человеческий синтаксис для пользовательского скрипта, например:
-- env = {...} заполняется внешним приложением
function user_tick()
return math.sin(env.enemy.hits + env.my.y)
end
При этом можно считать, что gc отключен и layout среды заморожен (т.е. новые таблицы не создаются, существующие не расширяются и т.д.). Сейчас используется довольно быстрая комбинация с кэшированием luaL_ref + lua_settable для установки контекста env, но, возможно, есть более производительное zero copy решение?
Anonymous
8
Aydar
Добрый день. Возник вопрос по C-API (встраивание). Есть ли легальный способ напрямую читать и модифицировать память нод таблиц Lua со стороны С? Решаемая задача: приложение, в которое встроен интерпретатор Lua, снаружи получает пользовательский скрипт, являющийся плотной числодробилкой, и этот скрипт зависит от кучи переменных "среды" (контекста), выставляемых приложением. Хочется минимизировать количество копий и C-API вызовов, при этом сохранив человеческий синтаксис для пользовательского скрипта, например:
-- env = {...} заполняется внешним приложением
function user_tick()
return math.sin(env.enemy.hits + env.my.y)
end
При этом можно считать, что gc отключен и layout среды заморожен (т.е. новые таблицы не создаются, существующие не расширяются и т.д.). Сейчас используется довольно быстрая комбинация с кэшированием luaL_ref + lua_settable для установки контекста env, но, возможно, есть более производительное zero copy решение?
Если env это сишная структура, то вам нужно завернуть ее в луашную userdata и прикрепить к этой userdata метатаблицу с метаметодом __index, это будет наиболее производительный вариант.
Aydar
Добрый день. Возник вопрос по C-API (встраивание). Есть ли легальный способ напрямую читать и модифицировать память нод таблиц Lua со стороны С? Решаемая задача: приложение, в которое встроен интерпретатор Lua, снаружи получает пользовательский скрипт, являющийся плотной числодробилкой, и этот скрипт зависит от кучи переменных "среды" (контекста), выставляемых приложением. Хочется минимизировать количество копий и C-API вызовов, при этом сохранив человеческий синтаксис для пользовательского скрипта, например:
-- env = {...} заполняется внешним приложением
function user_tick()
return math.sin(env.enemy.hits + env.my.y)
end
При этом можно считать, что gc отключен и layout среды заморожен (т.е. новые таблицы не создаются, существующие не расширяются и т.д.). Сейчас используется довольно быстрая комбинация с кэшированием luaL_ref + lua_settable для установки контекста env, но, возможно, есть более производительное zero copy решение?
Нашел вот такой пример https://github.com/hertogp/lua-capi-examples/blob/d7d782406b132e67ad837ba9c71cef5d0d70e399/src/ex04.c из него можно узнать как создать метатаблицу и прикрепить к юзердате
Anonymous
Вопрос для общего развития: а кто насколько большие объёмы кода на Луа встречал?
Snusmumriken
Участвую в прожэктах на 3-5кк/loc
Anonymous
А в байтах это сколько?
Wsevolod
Snusmumriken
Форматим?
Snusmumriken
Ну в основном как бы да
Wsevolod
понятно)
lua-formatter — єто ж ужас
Wsevolod
Про линтер уже молчу
Snusmumriken
Нормальный линтер, нормальный форматтер. Фич немного но типовой код форматируется без особых проблем. С извращениями проблемы, но их никто не любит.
Wsevolod
Snusmumriken
Линтер - luacheck
Anonymous
Меня тут сватают на проект в 300+М луашного кода. Я что-то даже не знаю, с какой стороны к этому всему подходить, да и стоит ли.
Wsevolod
Anonymous
Мегабайтов. Кода на Луа.
Snusmumriken
Ну если оно нормально декомпозировано то как бы нормас.
Anonymous
Я так понял, они даже слово "декомпозиция" не слышали.
Aydar
Мегабайтов. Кода на Луа.
Надо смотреть на проект, по количеству строк кода или по весу оценить толком не получится.
Aydar
Луачек не линтер.
А почему в его описании сказано обратное is a static analyzer and a linter for Lua ?
И вообще четкого определения что есть линтер не существует.
Highly Likely
Snusmumriken
Определять статический анализатор и линтер как просто линтер крайне странно.
Ммм. Я имею совершенно обоснованное право назвать его линтером, так как он имеет функционал линтера, и в данном контексте используется в первую очередь как линтер.
Точно так же как я могу обозвать нгинкс как вебсервером, так и проксей, кешем и балансировщиком (в зависимости от контекста), несмотря на то что он довольно комплексный. Если имеется некоторый контекст, нет необходимости тащить описание на десять тысяч слов для того чтобы просто обозвать нгинкс балансером, а луачек линтером.
Основная задача слов — донесение смысла. С этим они справились.
Mike_Went
Wsevolod
Как работает проверка под капотом, является ли __index/__newindex функцией или таблицей? Через type()?
usernameak
usernameak
https://github.com/lua/lua/blob/master/lvm.c#L308
Wsevolod
usernameak
а тебе зачем?)
usernameak
но ttisfunction, как и луашный type() вызывает ttype, так что... в принципе ты прав)
Wsevolod
Интересно знать про интерналы
Wsevolod
Почему luvit нету в luarocks?
Wsevolod
Snusmumriken
http://luarocks.org/modules/creationix/luv
Snusmumriken
Snusmumriken
Слушай, почему node.js нету в npm?
Snusmumriken
Это ровно та же причина, почему luvit нету в luarocks.
Wsevolod
luvit ведь набор оберток поверх luv, а не отдельный рантайм
Snusmumriken
Нет.
Snusmumriken
Это именно что отдельный рантайм, с кучей обёрткой над luv.
Snusmumriken
То что написано что "может быть использовано как библиотека" — не совсем правда. Можно поставить luv и частично использовать часть обёрток.
Wsevolod
Snusmumriken
Кстати, дай ссылку на свой luvit 2.0
Wsevolod
Snusmumriken
Вот то что lit нету в луароксе — странно. Но норм, просто скачай с гита.
Wsevolod
lit это же пакетник, т.е. как раз таки не либа
а с luvit вопрос все еще открыт
Snusmumriken
Закрыт.
Wsevolod
А что там в нем? Т.к. luv уже дает все, что дает libuv
Wsevolod
Ну или может есть какой то враппер поверх luv для http? Я не нашел
вызывалка curl-а не подходит
Snusmumriken
Кароч, возьми курл уже. Там есть асинхронщина. Или опенрестю, она асинхронная. Или лувит собственно.
Snusmumriken
Чего ты хочешь-то в конечном результате?