Anonymous
А вызывать как с передачей strs аргументом?
mva
вот только эт
mva
по хорошему, в объявлении функии, и внутри неё, лучше использовать другое имя
mva
ну, на всякий случай
Anonymous
Короче я все что можно перепробовал. Нифига,сдаюсь... можно пример?
Artem
всем привет, подскажите чем лучше сделать из такого: "Шахзада" в такое: "\u0428\u0430\u0445\u0437\u0430\u0434\u0430"
Александр
всем привет, подскажите чем лучше сделать из такого: "Шахзада" в такое: "\u0428\u0430\u0445\u0437\u0430\u0434\u0430"
какой-нибудь json encoder с режимом ascii only. можно и самому накостылить, но потом выяснится, что ещё кавычки надо экранировать и т.д.
Artem
а из готовых модулей, типа utf8.escape?
Александр
Kirill
Приветствую, как в случае отсутствия модулей подгружать их по мере необходимости? есть тысяча модулей с именами M0, M1 ... M99 внутри которых обязательно определена соответствующая одноимённая глобальная функция. эти модули могут быть использованы из других скриптов, как обойтись без require?
Kirill
подгружать все 1000 перед исполнением не вариант
Kirill
-- контроль плоскости Z вдоль Y require'M622' M622('Y30Z10')
Kirill
-- M622 угол разворота "кромка YZ" function M622(arg) local sc = 1000.0 if arg == nil then arg = ' ';sc=1.0 end -- заменяем nil argument на пустую строку local vect = Arg2Pos(arg):mul(sc); -- print(vect); -- вектор А local vA = CNC.Pos(); vA.Y = vect.Y; -- вектор Б local vB = CNC.Pos(); vB.Z = -vect.Z; StartMesure(); local org = mach.pos; -- текущие координаты FindTouch(vB); local p1 = mach.pos; -- координаты первой точки SetTouch(3); -- режим возврата mach:MOVETO(org); -- возврат в начальную точку mach:MOVE(vA); -- переход во вторую начальную точку local org1 = mach.pos; -- текущие координаты FindTouch(vB); local p2 = mach.pos; -- координаты второй точки SetTouch(3); -- режим возврата mach:MOVETO(org1); -- возврат в начальную точку mach:MOVETO(org); -- возврат в начальную точку StopMesure(); mach.Cond = 0; -- вычисление угла local ang = 0.0; local DZ = p2.Z-p1.Z; local DY = p2.Y-p1.Y; ang = math.atan(DZ,DY); ang = math.deg(ang); -- преводим в градусы if ang> 90 then ang = ang-180 end if ang<-90 then ang = ang+180 end -- передача угла в систему --mach:setANG(ang); logLine(string.format('angYZ:%.5f DZ:%.0f',ang,DZ)) return ang,DZ end
Kirill
Благодарю
Snusmumriken
Прост в твоём случае проще так: local lib = setmetatable({}, {__index = function(self, k) require(k); self[k] = _G[k]; return self[k] end}) lib.M622("Y30Z10") Но это всё равно не очень хорошо имхо.
Kirill
кроме функций ещё могут быть префиксные действия, несовместимые между модулями
Kirill
нужно грузить только нужные, иногда важен порядок, тогда точно require
Snusmumriken
Ужс какой. У тебя есть доступ к файлам-скриптам? Ты можешь их изменять?
Snusmumriken
В крайнем случае, оно манки-патчится.
Snusmumriken
Типа: function loadmodule(name) 1. Ищем файл со скриптом по package.path 2. Ищем префиксные штуки 3. Добавляем в начало текста скрипта локальную табличку, сгружаем в неё префиксные штуки 4. Заменяем имена префиксных штук в функции модуля на табличные, чтобы не пересекалась с другими 5. Саму функцию тоже пихаем в табличку 6. Ретурним из модуля табличку и кешируем где-нибудь end Скрипты — это текст, и с ними можно работать как с текстом, даже на лету. И будет совершенно пофигу на порядок, нормальные, изолированные друг от друга модули, не какающие в глобальное пространство. А если можно менять сами файлы — эти же операции можно проделать над каждым скриптом, теми же луями, заменив старую, глобально-какающую версию скрипта на новую, изолированную, нормальную.
Kirill
менять могу, и планирую. сейчас собираю варианты.
Kirill
когда я пытаюсь вызвать неопределённую функцию происходит поиск в глобальной таблице?
Snusmumriken
Есть таблица _G. Всё что объявлено без local (т.е. глобальное) — направляется туда. Когда ты пытаешься вызывать неопределённую функцию (или просто неопределённую переменную), луа сначала лезет на разные уровни видимости "выше текущего", а потом — да, в глобальную таблицу _G, в которой хранится всё глобальное.
Snusmumriken
Я даже скрипт накатал по переделке твоих скриптов (если оно там в подобном формате) в правильные: local currentstate = "const" local funcname = "" local pattern = "[a-zA-Z0-9_]+" for line in io.lines(arg[1]) do if currentstate == "const" then if line:find(pattern .. "%s+=") then io.write("local " .. line .. "\n") end end if currentstate == "func" then io.write(line .. "\n") end if line:find("^function") then currentstate = "func" funcname = line:match("function (" .. pattern .. ")") io.write("local " .. line .. "\n") end end io.write("return " .. funcname)
Snusmumriken
Берёшь батник с подобным содержимым: lua %~dp0/fixer.lua %1 > %1.fixed 2>&1 Пихаешь его в ту же папку что и скрипт (обзови скрипт fixer.lua): И правишь имя своего луёвого интерпретатора. После чего, перемещаешь на него файлы скриптов мышкой.
Kirill
Ок, попробую
Snusmumriken
Но бекап на всякий случай всё равно сделай ))
Anonymous
Подскажите пожалуйста... стал на этом моменте
Snusmumriken
local env = setmetatable({}, {__index = _G})
Anonymous
Это в подгружаемом файле?
Snusmumriken
Это в подгружаемом файле?
Это там, где ты задаёшь таблицу окружения. Я её обозвал env, т.е. environment.
Anatoliy
Всем привет, ребята подскажите кто нибудь имел дело с передачей каких нибудь значений из скрипта Луа в Эксель по технологии DDE (или по какой нибудь другой более современной - COM или OLE) В частности хочу вот что - в риалтайме из скрипта луа передавать новые значения в Эксель где они будут выстраиваться в два столбика - время/переданное значение
Lucky
Тоже вариант, только это VBA надо изучить, а лень 😁
Ну, что-то тебе придётся всё равно изучать. Почему не это?
usernameak
эксель можно скриптовать???
Anatoliy
Ну, что-то тебе придётся всё равно изучать. Почему не это?
Хотя кажись уже коечто нарыл на гитхабе, есть уже библиотечка luacom на гитхабе, делает как раз то что мне нужно
Leon174
Пригодится или нет? https://github.com/jmcnamara/xlsxwriter.lua
Lucky
http://my-excel.ru/voprosy/kak-txt-fajl-perevesti-v-excel.html
Anatoliy
http://my-excel.ru/voprosy/kak-txt-fajl-perevesti-v-excel.html
В приницпе да, писать из луа в CSV - самый простой вариант, даже преобразовывать ничего ненадо, но тогда придется этот CSV переоткрывать заново каждый раз после обновления, так что буду ковырять luacom - таким образом можно из луа в в открытый эксель сразу в рилтайме нове даные передавать
Snusmumriken
Snusmumriken
Читай не то, что человек пишет формально, а то, что именно он имеет ввиду.
usernameak
на винде нельзя писать в файл, если он открыт уже кем-то
mva
можно
usernameak
разве?
usernameak
она же ставит exclusive lock на запись при открытии
mva
если первооткрыватель явно открыл в не-эксклюзивном режиме
usernameak
а, то есть это только на удаление-переименование влияет?
Snusmumriken
В коде скрипта может быть функция записи типа такой: local function appendfile(text, file) local f = io.open(file, "ab+") f:write(text) f:close() end В таком случае, абсолютно пофигу на блокировки. Хоть и процесс записи незначительно замедляется.
Snusmumriken
Да, если у тебя есть utf8 в csv, чтобы excel потом нормально прочитал файл, допиши в начало \239\187\191.
Alexandr
Привет всем! Как можно высчитать дни между двумя датами. Типа "Вы зарегистрированы : "..(текущее время(os.date()) - 25.12.2020(дата регистрации)).." дней"
Snusmumriken
Для этого обычно пишут довольно крупные библиотеки, например https://github.com/Tieske/date
Snusmumriken
И то, оно не учитывает всякие добавочные секунды и часовые пояса.
Snusmumriken
Но в самом тупом варианте, прокатит и: local daysbetween = math.floor((current_time - saved_time) / (24*60*60)), где current_time и saved_time это результат os.time(), т.е. unix timestamp.
Snusmumriken
Для преобразования дат в таймстампы и обратно — используй os.date и os.time.
Anatoliy
Привет всем! Как можно высчитать дни между двумя датами. Типа "Вы зарегистрированы : "..(текущее время(os.date()) - 25.12.2020(дата регистрации)).." дней"
Есть такой такой вариант - есть такая вещь как текущий день юлианского календаря, вычисляется по формуле, вычисление по формуле в луа тебе придется сделать самому, подставляешь в формулу дату одного дня, потом другого, потом вычитаешь первый результат из второго вот и будет разность в днях https://yandex.ru/turbo?text=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%25AE%25D0%25BB%25D0%25B8%25D0%25B0%25D0%25BD%25D1%2581%25D0%25BA%25D0%25B0%25D1%258F_%25D0%25B4%25D0%25B0%25D1%2582%25D0%25B0&lite=1
Snusmumriken
Имхо нагромождение. Ещё один формат. Примерно как "преобразуем таблицы в json в yaml чтобы преобразовать в json"
Anatoliy
Имхо нагромождение. Ещё один формат. Примерно как "преобразуем таблицы в json в yaml чтобы преобразовать в json"
Потому что в луа часто каждый раз приходится изобретать велосипед, в других языках там уже готовые функции на любые нужды есть - и текущий таймштамп и юлианский день и преобразование из JSON в yaml и обратно ))) хотя в луа готового тоже много есть но это все надо искать на всяких гитхабах луароксах и т.д.
Snusmumriken
Ты это говоришь, но у меня есть подозрение что ты говоришь это без осознания всей беспросветности.
Snusmumriken
Ты кажется меня немного не понял. Ладно.
Anatoliy
Ты кажется меня немного не понял. Ладно.
Вернее я тебя совсе не понял. Ладно
Alexandr
Вот скачал модуль date с https://github.com/Tieske/date ... Но так и не понял как им пользоваться. Куда запихивать его?
Alexandr
Поисковики ответов не дают.
mva
я могу сказать почему никто не отвечает :)
mva
потому что текст и суть вопроса показывают практически нулевой уровень знаний в обсуждаемом предмете (программирование на Lua)
mva
и люди оценивают склько времени понадобится на то, чтобы объяснить и приходят к выводу что у них столько нету
mva
=======
mva
а отвечая по теме - запихивать туда, откуда интерпретатр потом сможет его загрузить
mva
см package.path/package.cpath