Roy
Сорян
Roy
Вот так есть проблемы (небезопасно)
string.format("Hello %s" .. message, "world ")
Roy
а вот так норм
string.format("Hello %s %s", "world", message)
Roy
Он весь message как надо вставляет (как строку)
Александр
Roy
Потому что я не так понял логи
Александр
Roy
У нас в тиме странные луашник
Roy
Кодит, как художник, пердящий красками на холст
Roy
У нас в string.format есть какие то баги в 5.0 версии луа и старше?
Igor
О, тут с администрацией горячо познакомиться хотят
Snusmumriken
Ага, ништяк, так горячо мне давно уже не было.
Igor
Ну вот, согрелся холодной осенью, круто же
Andrey
Коллеги с defoldом кто нить работал ? Скажите пожалуйста там можно несколько физических игровых объектов связать в цепочку и тянув за "паровоз" остальные тоже тянутся и тебе при этом пересчитывать ничего не надо . ? Сложно осваивается с нуля ?
Leon174
Andrey
О, у них чат есть! Значит я не по адресу. Спасибо!
Leon174
fgntfg
Иван
if 0 then
print("а почему???")
end
Иван
у луа же нет boolean
Wsevolod
Иван
Я просто сделал i % 2, и код постоянно в true ветку переходил
Иван
Иван
Wsevolod
Иван
ааааа
Иван
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'ов сломаются и оно пойдёт дальше.
Tony
Иван
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
Иван
== там никак не вставить
Tony
Snusmumriken
Ну тогда нормась.
Иван
Tony
Увидел, что есть, и выдохнул с облегчением
Snusmumriken
В luajit тоже есть, вобрали из свежих версий лучшее, хе.
Иван
Snusmumriken
В смысле?
Snusmumriken
Битовые операторы или битовая библиотека?
Иван
операторы
Snusmumriken
Просто забей. Есть функции.
Иван
Оххх, сложно то как
Иван
У нас битопляски везде будут...
Snusmumriken
Прости, а что именно вы там так пакуете?
Snusmumriken
Игровые объекты? Игровую карту?
Иван
Иван
Паковать даже координаты необходимо
Иван
(работа с сетью)
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;
}
Потом выгружаешь метатабличку и функции создания игровых объектов в луа, прописываешь деструкторы и всякую такую ерунду.
Иван
Нет, типа такого:
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;
}
Потом выгружаешь метатабличку и функции создания игровых объектов в луа, прописываешь деструкторы и всякую такую ерунду.
Ааа, вон как