Snusmumriken
Пример подобного можешь посмотреть тут: https://github.com/HDPLocust/raylib-luamore/blob/master/classes.h И тут: https://github.com/HDPLocust/raylib-luamore/blob/master/main.h
Snusmumriken
И кстати, тут неплохой такой набор утилити, в том числе по объектам, и примеры их применения.
Snusmumriken
Ааа, вон как
Карочи, абстрагируешь всю байтоёбскую ерунду на сишной стороне, логику делаешь на луях, развлекаешься. Луа с сишкой работает очень прямо и приятно. А то с двумя метрами оперативки особо не разгуляешься, для чисто луёвых вариантов хочется хотя бы 16.
Иван
Нам даже матрицы не нужны особо)
Snusmumriken
Ну и что, оно однотипное, берёшь первый попавшийся класс и смотришь как он устроен, какие функции дёргает и так далее.
Иван
(охх, у нас ещё Keil, в котором werror на unused функции)
Snusmumriken
Вдобавок тут md-доки больше чем кода, лол.
Иван
Вдобавок тут md-доки больше чем кода, лол.
Зато буду знать, как делать доку
Snusmumriken
Это только я так делаю доку. Тут где-то в репе ещё лежит скрипт, который извлекает !MD-фигню из всех файлов по списку и склеивает в одну доку.
Иван
Я боюсь как бы наши разработчики не сказали "да бл, я хочу 4 инта передать, почему я должен ради этого класс Rectangle создавать?"
Snusmumriken
Для базовых типов, кстати тоже можно накидать конструктор класса с перегруженной метой, просто чтобы на луях оперировать с конкретными типами. В луажыте, правда, оно уже встроено в луа, мол local foo = 100i
Snusmumriken
Эх, а в базовую луа это придётся впиливать отдельно.
Иван
А профилировщик на луа есть?
Иван
luajit?
Snusmumriken
А профилировщик на луа есть?
https://github.com/charlesmallah/lua-profiler
Snusmumriken
Но на него может не хватить оперативки ))0
Snusmumriken
Поэтому если не хватит — придётся обычными таймстампами: "чот эта функция медленно отрабатывает".
Иван
Запрашиваю код ревью)
Та я просто для себя, пощупать боттлнеки вот тут
Иван
Погоди
Иван
а нам оперативки-то хватит на luajit?
Snusmumriken
А вы можете использовать luajit? Он кажется не на ваши платформы, ты же говорил. По оперативке они жрут примерно одинаково, только в луажыте ты можешь сразу использовать ffi и разнородные сишные структуры напрямую, там оно как часть языка.
Иван
ffi не пробросим ни за что
а по поводу платформы - вдруг мы наймём того, кто сделает под наши процессоры
Иван
ffi не пробросим ни за что
потому что нам безопасность оч оч важна
Snusmumriken
С ффи можно делать вот так.
Snusmumriken
А безопасность — простите, это куда? Пока ты не запускаешь пользовательский код — безопасность как бы не под угрозой.
Snusmumriken
А если запускаешь — под угрозой в любом случае ))
Иван
И, наверное, ещё можно сделать char foo(int addr) { return *((char*)addr) }
Иван
И, наверное, ещё можно сделать char foo(int addr) { return *((char*)addr) }
Просто у пользователя, который это выполнит, может хоть фейрверк на плате устроить, хоть прошивку украсть, хоть ключи проверки
Snusmumriken
Хех, просто не устраивай феерверк на плате и не воруй прошивки, и не запускай в луях что-то пользовательское ))
Igor
Фейерверк на плате... звучит как что-то безумно красивое🤔
Igor
А вообще, любой код становится небезопасным, если пользоваиели получают возможность внедрять свой код, это не вина ффи
Snusmumriken
Отличный результат прохождения игры: феерверк на экране и на плате.
Igor
ffi виноват только в том, что добавляет еще больше (к и без того большому списку) возможностей выстрелить себе в ногу
Snusmumriken
Круто же, ну ))
Igor
Но если с умом его использовать, то выходит очень даже полезная и производительная штука
Igor
Круто же, ну ))
Не могу отрицать
Snusmumriken
Стрельба себе в ноги с двух рук по-македонски пиу-пиу
Igor
Но вот фейерверки на плате устраивать не доводилось пока((
Snusmumriken
У меня был шанс устроить феерверк на диодном кубе, пока писал на питоне (лол) драйвер для зажигания лампочек. Но я заблоговременно пнул разработчика платы чтобы влепил предохранитель ровно на этот случай.
Igor
Еще люблю, когда руки асинхронные
Snusmumriken
А то он такой: "Ну типа если ты пихнёшь в сдвиговый регистр переключения слоёв одновременно два и более слоя, то оно всё сгорит нафиг" — а я ему такой "Но-но! Лепи фигулину". После правок: "кароч, если ты криво напишешь, тут зажжётся лампочка и ни один слой куба гореть не будет". Пишу, запускаю — зажигается лампочка. Опечатался.
Igor
Штука одна тоже была у меня, до последнего не верил, что ошибка НЕ в моём коде. Писал драйвер на си для MAX7219. Соединил 4 матрицы и после определенного модуля матрицы какого-то хрена на выходе был мусор вместо данных, соответственно следующие матрицы в цепочке уже фигню показывали. А еще у этого волшебного модуля была особенность - зажигаешь все светодиоды и микросхема резетит своё состояние. Понадобилось что-то порядка 5 часов упорного неверия, чтобы всё таки понять, что брак в микросхеме, а не в коде что-то не так)))
Igor
Заменил микросхему и все начало работать просто прекрасно
Igor
Я уже тогда успел дойти до той точки, когда лезешь в код линукса, чтобы посмотреть, как же всё таки там работает SPI, чтобы понять, где же я ошибся
Snusmumriken
Да, не пишите драйверы для тяжело нагруженных штук на питоне. Вот тут питоновый скрипт читает изменения лампочек на слоях из сокета и с частотой в 30-80гц пробегает по всем слоям куба и заполняет сдвиговые регистры по текущему состоянию. Но из-за того что это питон со сборкой мусора, происходит мерцание и глаза устают.
Igor
Ух
Igor
А чего выбор на питон-то пал, когда фигнюшка по времени исполнения критична?
Snusmumriken
Там не надо было изобретать с gpio для малинки ))0 Лень.
Igor
Понимаю
Snusmumriken
А в сишку я тогда особо не лез, давно это было. Тем более драйвер принимает данные с сокетов, а в сишке приходилось бы изобретать кучу чуши с сокетами. Так что лень х2.
Igor
Ну во мне переодически просыпается дух авантюризма, который преодолевает лень и я начинаю клепать велосипеды пачками)))
Igor
Да к тому же на си
Snusmumriken
Там тоже сборка мусора и иммутабельные строки
Wsevolod
Там тоже сборка мусора и иммутабельные строки
Все-таки он джитится. А строки при чем?
Snusmumriken
Приём с сокетов это строка. Зачастую длинная.
Wsevolod
Хм, я думал bytes
Wsevolod
Да, socket.recv возвращает bytes
Snusmumriken
Иммутабельные.
Snusmumriken
Ну в смысле в следующий раз придёт ещё bytes, в новый буфер, который точно так же будет собран мусорщиком.
fgntfg
/spam
Иван
А как luajit построить без JIT? Интересует только интерпретатор
Иван
[ivan@pc host]$ pwd /home/ivan/p/luajit/src/host [ivan@pc host]$ gcc minilua.c -lm Оно ?
Иван
Нашёл XCFLAGS+= -DLUAJIT_DISABLE_JIT
Wsevolod
Какая разница между require"foo.bar.baz" и require"foo/bar/baz"?
Snusmumriken
Какая разница между require"foo.bar.baz" и require"foo/bar/baz"?
Выведи содержимое package.config. Там будет что-то подобное: > =package.config \ ; ? ! - Как вспомогательное, пример содержимого package.path: "/libdir/?.lua;/libdir2/?.lua" 1. \ или / как разделитель путей ОС и простой способ детектить, под вендой ли мы, на него будут заменены все точки в пути для require. 2. ; — разделитель путей в package.path/cpath. 3. ? символ подстановки имени файла в package.path/cpath. 4. ! — символ который будет заменён путём до интерпретатора. 5. - — специальная фигня для реквайринга сишных либ. Интерпретаторы используют обычное сишное чтение файлов, если сишка может прочитать файл скрипта с твоими модификациями путей — реквайрь как хочешь. Если нет — нет. Но лучше используй точку, она просто работает.
Wsevolod
Алсо, почему у меня на lua5.1-4 _G._LOADED == nil?
Snusmumriken
require"foo/bar" не выдаст закешированный require"foo.bar", но должен выдать закешированный require"foo/bar".
Snusmumriken
Если у тебя в файлах есть разночтение — напиши блин препроцессор: oldreq = require function require(...) local path = ... path = path:gsub("[\\/]", ".") return oldreq(path, select(2, ...)) end Но это костыль для решения костыльной задачи впихивания костылей.
Wsevolod
А можно было ведь считать ключ в кеше, заменяя сепараторы на что-то третье
Snusmumriken
НАПРИМЕР НА ТОЧКУ?!
Snusmumriken
Хехе
Wsevolod
НАПРИМЕР НА ТОЧКУ?!
Ну или так, why not
Snusmumriken
Ну или так, why not
Нет. Как ты написал так и будет. Препроцессоры добавят неоднозначности.