Daniil
по логике, return должен выходить только из do блока
Это break так сделает. А return из функции выходит из любого скоупа в ней.
Alexey
The unit of compilation of Lua is called a chunk break вроде только из циклов выходит while 1 do do do break end end end ( не проверял, но удивлюсь если несработает )
Daniil
Точно. Выходит из while сразу.
Snusmumriken
Чёт нелепо как-то. Можно же и в и love.draw получить dt
Можно в love.draw получить dt, и иногда это бывает крайне полезно, например "если игрок коснулся чего-то — нарисовать поверх него квадратик". Но есть такое правило под названием "разделение логики и представления". В первом у тебя логика, во втором — представление.
Snusmumriken
https://love2d.org/wiki/love.run
Snusmumriken
Которую можно изменить.
Иван
Крч непонятное усложнение. run вроде вообще убрали?
Snusmumriken
Нет, разумеется.
Snusmumriken
Крч непонятное усложнение. run вроде вообще убрали?
Да не усложнение это, ёпсель, это обычная нормальная практика разделения ))
Иван
Ааааааааааа
Snusmumriken
Ещё update/draw, как раз, разделены в том числе для принципиальной возможности пропуска кадров, моделирования срезов по времени, например в update идёт какой-то сверхтяжёлый малоостановимый процесс на корутинах, разрешаемый не за один десяток кадров, на draw — отрисовка текущего среза. Для фиксированного обновления физики, для полного формирования мешей/батчей, и в целом, для ru.wikipedia.org/wiki/Model-View-Controller
notepad++
А как вообще update реализовывается в других языках, без фреймворков, через потоки?
Snusmumriken
Хех, обычно точно так же как тут, обычный цикл, только разработчик обычно сам разделяет условный update и draw. Могут и через потоки: отрисовка в "главном", обновление в "параллельных".
Иван
https://code.matthewwild.co.uk/squish
Такого треша я давно не встречал, но оно работает Треш потому что чувак попытался сделать всё и сразу, а в итоге его программа не способна отличить require('lib') от -- require('lib')
Иван
ещё и зависимость от LOADLIB добавляется зачем-то, когда я старательно хотел её избежать
Иван
Какие ещё варианты? На learnxiny я видел следующее: -- Another file can use mod.lua's functionality: local mod = require('mod') -- Run the file mod.lua. -- require is the standard way to include modules. -- require acts like: (if not cached; see below) local mod = (function () <contents of mod.lua> end)() -- It's like mod.lua is a function body, so that -- locals inside mod.lua are invisible outside it.
Иван
Блин, а если сделать так, то будет сложнее дебажить код. В общем, единственное верное решение сделать файловую систему
Туплю. В Lua ведь можно в одну строчку код писать? Ну вот, AST парсером уберу комментарии, заменю multi-line строчки на one-line строчки, затем в одну строчку заменю require.
mva
ты упускаешь один момент
mva
require умеет грузить не только pure-lua модули, но и скомпилированные
Иван
СУПЕР
mva
а их не забандлишь
Иван
а, стоп, мне не нужен require
Иван
Я думаю, я мог бы сделать так: local mod = (function (); binary_eval("<и вот тут бинарь>"); end)()
Иван
а binary_eval на своей стороне имплементировать
Alexey
а их не забандлишь
Вообще достаточно просто. Просто копируешь все в один файл а при запуске разархивируешь в темп дир. я так с помощью l-bia в один exe файл паковал iup/lsqlite/socket библиотеки для простого гуёвого приложения. Правда l-bia пришлось допиливать чтобы он корректно библиотеки по папкам расскладывал. Ну и у iup был ефе фокус когда lua модуль одновременно еще является зависимостью для другой dll. К сожелению не уверен что версия l-bia у меня сохранилась
mva
так что с распаковкой вариант скорее всего не выгорит
Roy
Ребят, как проверить совпадает ли первый символ в массиве?
Roy
if chars[1] == '+' then print('find') end
Roy
что-то такое нужно
Roy
потому что string.find дорого, оно ищет по всему сообщение первое вхождение, а мне нужно сравнивать только первый символ на равенство
Иван
?
Highly Likely
if chars[1] == '+' then print('find') end
Ну вот так вот, например? :)
Roy
а еще дешевле нельзя?
Roy
просто по индексу сравнить
Highly Likely
Куда дешевле чем О(1)?
Roy
if chars[1] == '+' then print('find') end
Как то так невозможно сделать?
Иван
Как то так невозможно сделать?
https://stackoverflow.com/a/62901633/3184775
Highly Likely
А, там строка
Highly Likely
Да, кажется, только саб
Иван
Блин, я просто удивляюсь, насколько lua резиновая. Ещё бы += было бы... И макросы))
Иван
Макросы абсолютное зло
Я бы макросы чисто что бы классы в одну строчку писать
Иван
Я слышал, что есть Moonscript
Иван
Он заброшен?
Highly Likely
Скорее всего
Иван
А вообще можете рассказать про правила написания максимально производительного кода для Lua без JIT?
Иван
Где могут быть подводные камни, например
Иван
R
А вообще можете рассказать про правила написания максимально производительного кода для Lua без JIT?
Я как раз недавно накатал здоровенный гайд про это дело, но он под НДА. Вообще, Луа далеко не такая простая штука в плане производительности, как её любят представлять.
Snusmumriken
А вообще можете рассказать про правила написания максимально производительного кода для Lua без JIT?
Меньше размечать строк и таблиц ибо динамическая память, больше переиспользовать. В общем-то так же где и везде.
Luсky
Lua Performance Tips https://www.lua.org/gems/sample.pdf
R
Твой гайд попал в сеть интернет))
Нет :) Но надеюсь постепенно всё опубликовать.
Иван
А чо компилятор?
Иван
Я в этом документе постоянно вижу "Lua is not smart enough" и "Lua is smart enough"
Alexey
а еще дешевле нельзя?
string.byte(s,1,1) == 53 естественно для однобайтных символов. Это быстрее т.к. не ищется и не создается новая строка
Roy
я щас сделал так message:sub(1,1) == symbol
Roy
где message - это аргумент функции
Alexey
Тогда нужно еще string.byte(symbol) сделать и это еще один С вызов. Но если symbol это типа константы - то можно его и один раз вызвать
mva
я щас сделал так message:sub(1,1) == symbol
всё ещё можно сделать message:byte(1,1) == 53
mva
(только плюс это 43, кстати)
Alexey
(только плюс это 43, кстати)
Я по памяти. И не сильно ошибся А вот с юникодными вариантами - сложнее :)
mva
Я по памяти. И не сильно ошибся А вот с юникодными вариантами - сложнее :)
ну, вообще, да, но если упороться, то побайтово и юникод чекать можно, у меня даже где-то такой код валялся :) В любом случае, в данном кейсе товарищ ищет чтобы первым символом был плюс. А даже если дальше юикод - у него всё равно это получится :)
Alexey
С юникодом есть кодировки различные модификаторы нормализация И я не проверял, но что то мне подсказывает что в юникоде плюсов сильно больше одного
mva
ну, я вангую, что он пишет что-то типа бота, реагирующего на команды, начинающиеся с плюса :)
mva
если кто-то будет отправлять не тот плюс, что на клавиатуре, а юникодные, то ССЗБ и максимум пробелм которые будут - бот будет игнорировать такие команды :)
Roy
Вопросик есть по таблицам Есть следующий код
Roy
Если KrakenGmList не имеет элемента с GetActName именем, то будет ли создаваться какой нибудь объект в луа?
Roy
Я пытаюсь понять, выгодна ли такая проверка с точки зрения расходов по памяти. В С++ допустим хеш таблицы создадут объект если такого объекта не было при обращении, как Map["name"]