Roy
Сорян
Roy
Вот так есть проблемы (небезопасно) string.format("Hello %s" .. message, "world ")
Roy
а вот так норм string.format("Hello %s %s", "world", message)
Roy
Он весь message как надо вставляет (как строку)
Александр
а вот так норм string.format("Hello %s %s", "world", message)
*хлоп-хлоп-хлоп* (тебе это все объяснили несколько раз)
Roy
*хлоп-хлоп-хлоп* (тебе это все объяснили несколько раз)
Не, пацаны думали, что у меня строка уязвима даже если аргументы справа описаны
Roy
Потому что я не так понял логи
Александр
Не, пацаны думали, что у меня строка уязвима даже если аргументы справа описаны
Какие пацаны? Пацаны из этого чата так не думали точно
Roy
У нас в тиме странные луашник
Roy
Кодит, как художник, пердящий красками на холст
Roy
У нас в string.format есть какие то баги в 5.0 версии луа и старше?
🐅🤦‍♂️
Он весь message как надо вставляет (как строку)
Не пойму в чем разница. В любом случае нужно параметры на nil проверять перед вызовом format()? Почему-бы не обернуть в pcall()?
Igor
О, тут с администрацией горячо познакомиться хотят
Snusmumriken
Ага, ништяк, так горячо мне давно уже не было.
Igor
Ну вот, согрелся холодной осенью, круто же
Andrey
Коллеги с defoldом кто нить работал ? Скажите пожалуйста там можно несколько физических игровых объектов связать в цепочку и тянув за "паровоз" остальные тоже тянутся и тебе при этом пересчитывать ничего не надо . ? Сложно осваивается с нуля ?
Andrey
О, у них чат есть! Значит я не по адресу. Спасибо!
fgntfg
Иван
if 0 then print("а почему???") end
Иван
у луа же нет boolean
Wsevolod
if 0 then print("а почему???") end
Потому что falsy в луа только nil и false
Иван
Я просто сделал i % 2, и код постоянно в true ветку переходил
Иван
Есть
точно
Иван
ааааа
Иван
not (not 0) == true
а теперь уже гвн код))
Иван
i % 2 ~= 0
Иван
приходится так выкручиваться
Иван
А как сделать DEBUG and print("Debug: ...")?
Иван
без if
Иван
Понятно...
Иван
Никак 0 and print("true") or print("false") lua: ./just_some_lua.lua:70: unexpected symbol near '0'
Snusmumriken
if 0 then print("а почему???") end
Во-первых есть boolean. Во-вторых, ложное выражение есть только у nil и false. 0 == true {} == true -100500 == true false == false if nil then это не выполнится end
Snusmumriken
Никак 0 and print("true") or print("false") lua: ./just_some_lua.lua:70: unexpected symbol near '0'
Тебе нужно выражение возвращающее значения. foo = true and 10 or 20 -- foo = 10 bar = false and 10 or 20 -- bar = 20 Print же ничего не возвращает, то есть выражение вроде something = 0 and print("true") or print("false") выведет и то и другое: Сначала определится ноль, он истинный, выражение перейдёт к print("true"), которое вернёт nil являющийся ложью. Логическое выражение не выполнилось, идём дальше в or print("false") — оно выполняется, something теперь равен nil и оба текста вывелись. Для логических функций ты делаешь обёртки возвращающие true или что тебе нужно.
Snusmumriken
Так что логические тернарники в наличии, просто они требуют выражения и определённые, несколько упрощённые механизмы.
Snusmumriken
function tprint(...) print(...) return true end something = 0 and tprint("true") or tprint("false") или if (0 and tprint("true") or tprint("false")) then ... end Вот этот код будет выполнен именно так как тебе хочется, функция возвращает true и не ломает логические выражения ))
Иван
https://stackoverflow.com/questions/2580136/does-python-support-short-circuiting
Snusmumriken
Так и происходит. function doSomething(a, b, c) return a + b + c end function doSomethingElse(a, b, c) return a * b * c end foo = 0 and doSomething(1, 2, 3) or doSomethingElse(4, 5, 6)
Иван
foo = 0 and doSomething(1, 2, 3)
Иван
или noop какой-нибудь вставить
Snusmumriken
Да, конечно. Foo станет false если первое выражение ложно.
Tony
Не могу поверить, что goto добавили только в 5.2
Tony
Я бы скорее поверил, что его убрали
Snusmumriken
foo = 0 and doSomething(1, 2, 3)
foo = 0 and doSomething(1, 2, 3) == foo = false if (0) then foo = doSomething(1, 2, 3) end foo = 0 and doSomething(1, 2, 3) or doSomethingElse(4, 5, 6) == foo = false if (0) then foo = doSomething(1, 2, 3) else foo = doSomethingElse(4, 5, 6) end Ровно до тех пор пока все условия кроме первого выдают истинные значения, иначе связки and'ов сломаются и оно пойдёт дальше.
Snusmumriken
Я бы скорее поверил, что его убрали
Если ты не умеешь им пользоваться — это не значит что никто не умеет. Прости за агрессию, я устал тыкать людей в goto.
Иван
DEBUG = 0 DEGUB = 0 and print("silent") DEGUB = 1 and print("verbose") DEGUB = 2 and print("very verbose") print("DEBUG", DEBUG) Вывод: silent verbose very verbose DEBUG 0
Иван
== там никак не вставить
Snusmumriken
Ну тогда нормась.
Иван
DEBUG = 0 DEGUB = 0 and print("silent") DEGUB = 1 and print("verbose") DEGUB = 2 and print("very verbose") print("DEBUG", DEBUG) Вывод: silent verbose very verbose DEBUG 0
Как-то так... _ = DEBUG == 0 and print("no output") _ = DEBUG == 1 and print("verbose") _ = DEBUG == 2 and print("very verbose")
Tony
Увидел, что есть, и выдохнул с облегчением
Snusmumriken
В luajit тоже есть, вобрали из свежих версий лучшее, хе.
Snusmumriken
В смысле?
Snusmumriken
Битовые операторы или битовая библиотека?
Иван
операторы
Snusmumriken
Просто забей. Есть функции.
Иван
Оххх, сложно то как
Иван
У нас битопляски везде будут...
Snusmumriken
Прости, а что именно вы там так пакуете?
Snusmumriken
Игровые объекты? Игровую карту?
Иван
Прости, а что именно вы там так пакуете?
У нас embedded и 2 мб оперативки
Иван
Паковать даже координаты необходимо
Иван
(работа с сетью)
Snusmumriken
Есть вариант написать на сишке набор абстракций над битовой фигнёй. Выгружаешь в луа предельно сжатые объекты, луа при чтении и указании полей будет дёргать сишные функции которые ковыряют биты.
Иван
(и играми)
Иван
[ivan@pc some-test]$ time luajit ./just_some_lua.lua 158028 real 0m5.690s user 0m5.684s sys 0m0.000s [ivan@pc some-test]$ time pypy3 ./just_some_python.py 158028 real 0m0.300s user 0m0.269s sys 0m0.017s [ivan@pc some-test]$ time ./cmake-build-release/some 158028 real 0m0.099s user 0m0.099s sys 0m0.001s
Иван
LuaJIT не такой быстрый, как PyPy :(
Иван
Запрашиваю код ревью)
Snusmumriken
Нет, типа такого: struct GameObject { int pos; int vec; } int lua_class_gameobject_new(lua_State *L){ GameObject * o = (GameObject *)luax_newobject(L, "GameObject", sizeof(GameObject)); int x = luaL_checknumber(L, 1); int y = luaL_checknumber(L, 2); o.pos = x & (y >> 0xF); return 1; } int lua_class_gameobject_Get(lua_State *L){ GameObject * o = (GameObject *)luaL_checkudata(L, 1, "GameObject"); char field = luaL_checkstring(L, 2)[0]; if (field == 'x') { lua_pushnumber(L, o.pos & 0xFF); } else if (field == 'y') { lua_pushnumber(L, o.pos << 0xF); } return 1; } Потом выгружаешь метатабличку и функции создания игровых объектов в луа, прописываешь деструкторы и всякую такую ерунду.