Lurk
А подскажите локальные функции это аля лямбды?
Lurk
Да.
Спасибо большое за помощь!
Snusmumriken
Логические свитчи — вполне себе свитчи. Правда для них нужно какое-то выражение.
Snusmumriken
Если нужна какая-то последовательность действий — пихай в качестве результата вызов функции, возвращающей true или какое-то требуемое значение, иначе оно дальше пойдёт. Если нужен nil или false — пихай в конец, к другим nil/false, если есть. Ну, щобы логика была логичной.
Evgeniy
Всем привет. Подскажите пожалуйста. Ковыряю моды для farming simulator. Нашел интересующий меня мод. Декомпилятор мне подсказал, что в коде используются строки: pipe io open \\.\pipe\MODname closePipe LastPipeReset LastPipeConnectTimeStamp sendStrData sendIntData sendDoubleData Вопрос. В lua можно как-то использовать эти pipe? Там каким-то образом данные из игры перекидываются в другое приложение
Snusmumriken
В целом, можно совершенно спокойно открыть один и тот же файл двумя программами, одной построчно в него писать, другой параллельно построчно же считывать. Какой-нибудь tail так и работает, например. В конце транзакции можно удолить. Всё потому что вендовые пайпы не шибко удобны. Я себе для всякой фигни делал in-ram-пайпы на редисе: Одна программа открывает, допустим local file = io.open("lua mypipe.lua -w mypipename", "wb") Другая соответственно local file = io.open("lua mypipe.lua -r mypipename", "rb") Первый скрипт пишет то что пришло в stdin в редиску, второй читает оттуда же и пишет в stdout. Костыль? Костыль. Но довольно функциональный, при желании двумя пайпами делается дуплекс. В линуксах есть нормальные встроенные в ОС пайпы, но под вендой их нема, а те что есть требуют ffi/сишных расширений.
Snusmumriken
Ещё простой способ связи разных приложений это, например, сокеты. И они легко делаются асинхронными. Отправка на локалхост обычно даже не задействует сетевую карту, и спокойно передаётся по оперативке.
Evgeniy
отлично, хорошо когда способов много)
Snusmumriken
Не а, в стандартной либе только файлы из подобного.
Evgeniy
ок
Snusmumriken
В линексе ты можешь открыть пайпу встроенную в ОС как файл, но реальных файлов не пишется )
Anonymous
Извините, можете ли вы подсказать, тут такая ситуация: Пытался делать игры в роблоксе (речь не про него) и тут вижу такой код. И вот интересно, и как здесь работает "function (player) player.CharacterAppearanceId = 800948793 end" Этот код начинает работать при вызове функции Connect, фильтруя что-то? Я пытался найти документацию на эту функцию(Connect) - не нашел, только на ChildAdded, не уверен что поможет к решению но ChildAdded возвращает Instance. Может кто знает/кто сталкивался с таким кодом? думаю это лямбда но не уверен Конкретнее спрошу: в какой момент функция в аргументах выполняется
Igor
грубо говоря да
Igor
представь себе таблицу, функция Connect вносит в эту таблицу функции, которые ты ей передаёшь аргументом
Igor
а игровой эвент итератором перебирает эту таблицу и вызывает каждую из них при определённом событии
Anonymous
Хорошо, спасибо за помощь.
Aydar
то-есть, Коннект - специальная функция, чтобы добавлять код к другой?
Функция Connect описана здесь https://developer.roblox.com/en-us/articles/events#:~:text=The%20Connect()%20function%20can,a%20Part%20in%20the%20Workspace%20.
Snusmumriken
Её бы переименовать в bind, куда ближе к истине, как вызов функций на кнопки, или биндинг функций к событиям.
marroty
Добрый день! У меня есть устройство, с которым я хочу общаться из-под Windows через uart. Соответственно передаются команды-читаются ответы. При работе в ручном режиме через teraterm все хорошо. В lua я использую local serial = assert(io.open("COM3", "w")) serial:write("{4:0001}\n") serial:close() serial = assert(io.open("COM3", "r")) local line=serial:read() serial:close() Но похоже, что оно не работает - не совпадают скорости (устройство на 115200). Вопросов собственно два: - можно ли как то в таком формате работы с comport'ом настроить скорость - можно ли одновременно писать-читать устройство без постоянного переоткрытия порта в нужном режиме?
marroty
Да, я поменял настройку по умолчанию, но пока не взлетело
Snusmumriken
Потому что file:read() блокирует до появления EOF, а file:read("*l") будет блочить только до EOL.
marroty
Потому что file:read() блокирует до появления EOF, а file:read("*l") будет блочить только до EOL.
Ну в ответах у меня точно нет EOL, только \r\n. Спасибо, сейчас проверю
Snusmumriken
Ну в ответах у меня точно нет EOL, только \r\n. Спасибо, сейчас проверю
Я перепутал, EOL это как раз \r\n, EOF - мета-фигня конца.
marroty
А разве режим rb, в отличии от r не пропускает x00?
Snusmumriken
rb — читает всё, r — фильтрует всякую фигню
Snusmumriken
Я практически всегда использую rb, потому что от r больше проблем.
Snusmumriken
Ну в ответах у меня точно нет EOL, только \r\n. Спасибо, сейчас проверю
У serial, кстати, EOF'ом вроде работает 0x1A, но я не уверен будет ли оно работать в луях.
marroty
Ну со стороны устройства я формат могу задавать точно, там у меня fpga. Спасибо за помощь! А одновременно порт на чтение и запись нельзя открывать, да?
Snusmumriken
Открой два порта )
Snusmumriken
Ну, local in = assert(io.open("COM3", "rb")) local out = assert(io.open("COM3", "wb")) Возможно получится.
marroty
Так COMn - один же, я проверю, но вроде винда ругается на такое
Snusmumriken
О, и правда ругается
marroty
да, второй вызов обломался
marroty
но это ожидаемо - тератерм когда так сидит, луа тоже не достучится
marroty
А режим append вроде есть - он не про r/w?
marroty
Ладно, спасибо за подсказки, завтра полезу анализатором смотреть, кто же портит мне малину 😊 Удачного дня!
marroty
Открой два порта )
А вот это наверное здорово - вывести второй аппаратный uart и разделить rx/tx.
Aydar
А режим append вроде есть - он не про r/w?
"r+b" вроде работает для одновременного бинарного чтения/записи, винды нет чтобы проверить.
marroty
"r+b" вроде работает для одновременного бинарного чтения/записи, винды нет чтобы проверить.
Да, я проверил на стандартных файлах - именно в таком режиме 'r+b' позволяет одновременно и читать файл и потом дописывать в конец, спасибо!
Oleksandr
Доброго времени суток. Вот пытаюсь понять в чём именно разница выполнения Lua скрипта с помощью Lua интерпретатора (стандартного) и LuaJIT. Правильно ли я понимаю, что если запущу на исполнение модуль содержащий синтаксическую ошибку, то стандартный Lua ничего не выполнит и скажет, что есть ошибка, а LuaJIT начнет выполнение и выдаст ошибку только если участок кода с ошибкой нужно будет выполнить?
Oleksandr
Второй вопрос, зачем может быть нужна Just In Time компиляция?
mva
jit преобразует (компилирует) код на интерепетируемом языке в байткод, и вполняет уже его в виртуальнйо машине, заточенной на быстрое выполнение этого байткода
mva
а "класисческие" интерпретаторы - просто выполняют полученные в виде комманд инструкции
Oleksandr
Благодарю.
Oleksandr
jit преобразует (компилирует) код на интерепетируемом языке в байткод, и вполняет уже его в виртуальнйо машине, заточенной на быстрое выполнение этого байткода
Но luac утилита, по ее описанию, делает то же самое - компилирует Lua синтаксис в байт-код который и будет выполнен интерпретатором
Oleksandr
А вот jit, как я почитал, проводит компиляцию байт кода в нативный код. Отсюда и вопрос: а если я 2 раза буду запускать один Lua скрипт с использованием LuaJIT компилироваться в нативный код будет дважды или один раз?
mva
"just in time"
mva
во время выполнения
mva
каждый раз
mva
вот только там речь немного про разный байткод
mva
одно дело байткод luavm
mva
который генерируют luac и luajit -c
mva
а другое дело - то, во что Luajit транслирует код при включенном JIT
mva
по сути, он компилирует программу по аналогии с llvm/clang
Oleksandr
Ага. Вот мы и вернулись к первоначальному вопросу: а в чем тогда принципиальная разница между Lua и LuaJIT, если они оба транслируют синтаксис Lua в нечто исполняемое каждый свой запуск на выполнение. Неужели в том, что Lua сразу выполняет, но со средней скоростью, а LuaJIT долго стартует (так как компилирует в машинный код) а потом быстро работает?
Highly Likely
Благодарю, ознакомлюсь.
https://www.youtube.com/watch?v=Q3r9IWYDGsc
Highly Likely
https://www.youtube.com/watch?v=Q3r9IWYDGsc
Вот тут, емнип, еще проще
Oleksandr
Угу гляну оба. Благодарю всех. Здоровья вам.
Oleksandr
На все свои вопросы ответы получил. Благодарю.
Snusmumriken
Доброго времени суток. Вот пытаюсь понять в чём именно разница выполнения Lua скрипта с помощью Lua интерпретатора (стандартного) и LuaJIT. Правильно ли я понимаю, что если запущу на исполнение модуль содержащий синтаксическую ошибку, то стандартный Lua ничего не выполнит и скажет, что есть ошибка, а LuaJIT начнет выполнение и выдаст ошибку только если участок кода с ошибкой нужно будет выполнить?
Есть два типа ошибок (вне зависимости от интерпретатора) — логические и синтаксические. Перед тем как любой интерпретатор запускает кусочек кода, он проверяет его синтаксическую часть, например function foo() ... eMd ругнётся, мол, ожидается end. В процессе исполнения кода могут вылезти логические ошибки, например function foo(a, b) return a + b end foo("привет", 20) Синтаксически тут всё верно, но ошибка неправильных типов может произойти только в рантайме, в конкретном месте. Опять таки, это не зависит от интерпретатора.
Snusmumriken
Единственное (для тебя) различие lua и luajit это то, что luajit гораздо быстрее, особенно в простых циклах без особого ветвления. Это всё.
Snusmumriken
Ага. Вот мы и вернулись к первоначальному вопросу: а в чем тогда принципиальная разница между Lua и LuaJIT, если они оба транслируют синтаксис Lua в нечто исполняемое каждый свой запуск на выполнение. Неужели в том, что Lua сразу выполняет, но со средней скоростью, а LuaJIT долго стартует (так как компилирует в машинный код) а потом быстро работает?
Если что, luajit НЕ стартует дольше обычного интерпретатора. Просто когда выполняются инструкции, он подсчитывает итерации, и если вдруг количество итераций некоторой последовательности команд превысила N раз — он берёт и компилирует их, прямо в промежутке между исполнением. Он не компилирует всё подряд, только частовыполняемые последовательности, и делает это прямо в середине процесса исполнения (и делает это очень быстро).
Oleksandr
R
А int64 в luajit ещё не сделали?
Igor
А int64 в luajit ещё не сделали?
"Еще"? LuaJIT как таковой с 2017 года не обновлялся. Последняя вышедшая версия 2.1-beta3 (в которой, к слову, я спокойно работаю с 64битными указателями, библиотеками и прочей нечистью). Есть всякие сторонние форки, которые сами развивают jit на основе кода LuaJIT, например LuaVela, но я их особо не трогал.