Null
(5.1->5.4 + luajit)
Null
(да, некоторые криворуки не умеют правильно дефайны написать, но что уж поделать, таких я патчу уже как мейнтейнер в линуксодистрибутиве)
Null
а если код либы на Pure Lua, то его писать совместимо - очень легко. И несовместимым его можно делать только специально (упарываясь по goto, по integer и т.п.)
Timur
(да, некоторые криворуки не умеют правильно дефайны написать, но что уж поделать, таких я патчу уже как мейнтейнер в линуксодистрибутиве)
ну и какой идиоматичный способ, задокументированный где-нить, позволяет эффективно и без накладных расходов диспатчить различный код в зависимости от версии языка или luajit? что в языке облегчает эту задачу?
R
а если код либы на Pure Lua, то его писать совместимо - очень легко. И несовместимым его можно делать только специально (упарываясь по goto, по integer и т.п.)
С одной стороны, да. С другой... имею опыт наблюдения за большой кодовой базой, где мелкие особенности версий вырастают до полной несовместимости. Но тут за счёт объёма, конечно.
Snusmumriken
ну и какой идиоматичный способ, задокументированный где-нить, позволяет эффективно и без накладных расходов диспатчить различный код в зависимости от версии языка или luajit? что в языке облегчает эту задачу?
О-хо-хоо, это огро-о-о-омная мировая проблема всего программирования :) Но у луёв есть _VERSION, а чтобы чекнуть на jit — Достаточно влепить проверку наличия таблицы jit. Делается хоть с луёвой хоть с сишной стороны.
Null
ну и какой идиоматичный способ, задокументированный где-нить, позволяет эффективно и без накладных расходов диспатчить различный код в зависимости от версии языка или luajit? что в языке облегчает эту задачу?
Я уже сказал. "в языке" облегчает эту задачу не юзать goto и integer. А чтобы делать совместимо на стороне C - есть ifdef'ы с проверкой версии и дефайном функций. Других способов никто и не использует ни в каких языках 🤷‍♂️
Stanfox1984
Не знал что есть сообщества по Lua
Snusmumriken
Куда путь держишь, сталкер?
Денис
Lua - это язык для эмбеддинга (встраивания) во всё и вся. Под неё всё есть, но не в коробке. В этом и сама суть языка. В коробке только то, что нужно чтобы сделать всё, что понадобится. И ничего лишнего. Нужно что-то - ставишь либу с этим (или пишешь сам, если либа слишком жирная или не существует). Если тебе это не нравится - ты ошибся с выбором языка. В общем, вспоминая одного моего знакомого: Python tries to give you as much as possible, while Lua tries to give you as less as possible.
Я бы даже сказал, что Lua позиционируется как язык для ембеддинга. Стэндалон здесь так, бонусом. Вся проблема в том, что даже сами разработчики его так позиционируют, а исполняшки в дистрибутиве - это так, чтобы было. При этом, я лично нисколько не отрицаю его стэндалонность, с прямыми руками это один из более менее быстрых интерпретируемых языков с довольно приятным синтаксисом со свободной парадигмой написания кода. еще одна проблема - это отсутствие большого комьюнити, в виду этого, очень мало импленентаций тех или иных решений, а то, что есть, нужно еще умудриться собрать. Меня язык подкупил скоростью интерпретации. Все проблемы так или иначе решаются, если, опять же, имеем в комплекте прямые руки. Да, иногда прямость рук недостаточна, но тем не менее.
Timur
Я бы даже сказал, что Lua позиционируется как язык для ембеддинга. Стэндалон здесь так, бонусом. Вся проблема в том, что даже сами разработчики его так позиционируют, а исполняшки в дистрибутиве - это так, чтобы было. При этом, я лично нисколько не отрицаю его стэндалонность, с прямыми руками это один из более менее быстрых интерпретируемых языков с довольно приятным синтаксисом со свободной парадигмой написания кода. еще одна проблема - это отсутствие большого комьюнити, в виду этого, очень мало импленентаций тех или иных решений, а то, что есть, нужно еще умудриться собрать. Меня язык подкупил скоростью интерпретации. Все проблемы так или иначе решаются, если, опять же, имеем в комплекте прямые руки. Да, иногда прямость рук недостаточна, но тем не менее.
так-то, на любом языке проблему решаются если есть прямые руки...
Snusmumriken
Ну тут как всегда, вопрос количества усилий.
Timur
с луа обычно больше 🤷‍♂️
Null
с луа обычно больше 🤷‍♂️
зависит от опыта 🤷‍♂️
Null
не помню когда последний раз приходилось трахаться с Lua 🤷‍♂️
Timur
с луа обычно больше 🤷‍♂️
(потому что сообщество маленькое, SO маленькое, количество пакетов мало, время на траблешутинг дольше)
Snusmumriken
Лол, я просто накатал себе библиотечек которые использую 95% времени. Ну и что-то общеупотребительное вроде луасокета-сжсон с норм мейнтейнерами.
Snusmumriken
что вы имели ввиду?
Ровно то что написано на упаковке.
Dmitriy
ну я про кусочек io
Dmitriy
где забинжено из какой сишки?
Snusmumriken
ну я про кусочек io
Смотри. local file = io.open("file", "rb") Это запрос к ОС. За хендлером файла. ОС обрабатывает всякую ерунду, вроде файловой системы. Но не везде есть ОС и файловая система. Например, представь что у тебя микроконтроллер с припаянной напрямую к ногам флешкой. Придётся адаптировать чтение через луёвый драйвер файловой системы этой флешки, и добавлять слой совместимости с io чтобы восстановить функционал.
Snusmumriken
И луёвое io это прямой биндинг сишной стандартной либы. Вот этого вот — FILE *fopen( const char * filename, const char * mode ); Притом луа буквально использует именно этот функционал прямо из сишки. Просто маленькая обёрточка вокруг хендлеров.
Dmitriy
тэкс, пойду почитаю, что такое хэндлер
Snusmumriken
Хе
Dmitriy
я с луа недавно стал только дружить, уж не обессудьте)
Snusmumriken
Оно никак не пересекается с луа, это общеупотребительная практика.
Snusmumriken
Это что угодно, что работает маркером чего угодно. Например, число. int hnd = winapi.getWindowHandler(); Опа, мы получили число 1231234124. Нам оно ни о чём не говорит, но мы, допустим, можем изменять размер этого окна через winapi.setDimensions(hnd, 800, 600);
Dmitriy
тю, это же обработчик событий
Snusmumriken
Какие события?
Snusmumriken
Обработчик событий это функция, вызывающаяся на событие. А хендлер — указатель на любую ерунду, который сам по себе ничего не означает кроме того что он означает, и его можно использовать как маркер.
Dmitriy
Обработчик (handler) -- это функция, которая вызывается какой-либо программной системой в ответ на наступление какого-либо события.
Snusmumriken
Чел.
Snusmumriken
Забей в гугл "многозначные слова" и прочитай всё что найдёшь.
Snusmumriken
Обработчик (handler) -- это функция, которая вызывается какой-либо программной системой в ответ на наступление какого-либо события.
И подобные функции куда чаще называют callback'ами чем хендлерами. Это тебе так, для общего образования.
Dmitriy
Я не против образовываться - ведь человек учится всю свою жизнь. Запомню
Snusmumriken
Я не против образовываться - ведь человек учится всю свою жизнь. Запомню
Человек учится когда учится. Когда человек не учится — человек не учится. Точка.
Snusmumriken
Говорю как преподаватель.
Dmitriy
int hnd = winapi.getWindowHandler(); ну тут такое ощущение - что это уникальный идентификатор окна мы получаем, а потом используя идентификатор объекта задаем ему свойства. И все это делается через какие-то системные функции. Верно понял?
Snusmumriken
Да, именно так.
Snusmumriken
Причём идентификатор может быть "из песочницы", чтобы ты, например, не мог каким-то образом получить идентификатор окна другого приложения и менять его. С файлами у стандартной сишки точно такие же хендлеры. У луа же, ООП обёртка вокруг хендлеров файлов. Крошечная. Но делает ровно те же вызовы тех же сишных функций.
Dmitriy
А еще - по ходу беседы я правильно понял, что весь основной функционал луа умещается в ~2мб? я работаю со встраиваемыми системами, которые программируются на lua но хотелось бы разобратьсЯ и может запилить в свой камень lua
Snusmumriken
пол метра бинарь, рантайму желательно чутка поболее под внутренние штуки и собственно работу интерпретатора.
Snusmumriken
В целом, луа становится прям комфортно использовать с 8-16мб оперативки. Можно плодить кучу мусора.
Snusmumriken
(насрать)
Snusmumriken
Да не, я про 128кб оперативки и 1мб встроенной
Тут куда проще сишка. Слишком мелкое.
Dmitriy
192кб - freertos + Lua влазят легко
Dmitriy
Только что посмотрел и почитал
Null
192кб - freertos + Lua влазят легко
lua можно и без rtos втыкать на микроконтроллеры 🤷‍♂️
Snusmumriken
192кб - freertos + Lua влазят легко
Проблема в другом, и она звучит как "Зачем?". Ну будет у тебя 128 кб оперативки. Ну объявишь ты десять переменных и табличку. Но на каждый пук придётся вызывать collectgarbage после любой разметки памяти. Сишка в данном случае проще раз в двадцать, и не жрёт лишнюю память.
Snusmumriken
Грубо говоря, потратить 5% памяти на интерпретатор — совсем не то же самое что потратить 60% на интерпретатор.
Dmitriy
Встраиваем Lua интерпретатор в проект для микроконтроллера (stm32) / Хабр https://habr.com/ru/post/459602/
Dmitriy
Ну, вдохновился этим, + ещё обнаружил годную статью луа за 60 минут
Dmitriy
Я изначально на си прожил. Но щас как перешёл на автоматизацию - паралельно учу js, python, Lua, c++, Linux bash углубленно.
Dmitriy
Товарищи, len(a) и #а тождественны? Я вот читаю и чот не пойму?
Александр
Александр
по сути # это эквивалент string.len для строк и table.getn для таблиц
Snusmumriken
по сути # это эквивалент string.len для строк и table.getn для таблиц
В доке по 5.1 написано что нема table.getn, но есть table.maxn который проходит по табличке с 1 до N, ища первое же вхождение nil. Мол, чисто непрерывная часть. Но # использует бинарный поиск, и в случае таблицы с дырками может возвращать результат до первой попавшейся любой дырки (проверено практикой и чтением сорцов).
Александр
Но честно говоря подобное рассоглассование - так себе
Snusmumriken
А у строк он просто возвращает размер выделенного буфера под эту строку, ничего не вычисляя (кроме хеша строки).
Александр
# может быть доопределён метаметодом
Snusmumriken
__len.
Snusmumriken
Бтв лично я просто не использую таблицы с дырками, поэтому # для меня самый короткий и быстрый по исполнению вариант.
Snusmumriken
Я это обсуждал уже сто миллионов раз, и как будто в бесконечно вечной вселенной преисполнился познания что никому не верю и ничего не жду.
Dmitriy
Я когда спекнулся в сисадмина и стал массово ставить форточку - одни и те же вопросы, одни и те же ответы. Я даже по ним памятку распечатал на 7 листов.
Snusmumriken
Я когда спекнулся в сисадмина и стал массово ставить форточку - одни и те же вопросы, одни и те же ответы. Я даже по ним памятку распечатал на 7 листов.
Всё в порядке, я уже написал статью по метатабличкам с простыми и популярными примерами и даже парой картинок.
Dmitriy
Так и тут. Я читаю - что len возвращает мне длину строки или размер {}. Тут же вижу конструкцию типа #a. Ну писать 1 решетку так то выгоднее на больших кусках кода, однако чувствую, что "есть ньюанс"
Snusmumriken
Так и тут. Я читаю - что len возвращает мне длину строки или размер {}. Тут же вижу конструкцию типа #a. Ну писать 1 решетку так то выгоднее на больших кусках кода, однако чувствую, что "есть ньюанс"
Фигня в том, что у луа нет функции len. Это из питона вероятно. По отдельности есть string.len и table.maxn. И решётка у строк прямое сокращение до string.len, а у табличек — не совсем.
Dmitriy
function uart_send(msg) local tmp = {} for i = 1, #msg do tmp[i-1] = msg[i] end uart_send_data(tmp) --here the send command end
Snusmumriken
function uart_send(msg) local tmp = {} for i = 1, #msg do tmp[i-1] = msg[i] end uart_send_data(tmp) --here the send command end
msg это массив символов в табличке или таки луёвая строчка?
Dmitriy
Массив hex