Size: a a a

2021 January 22

S

Snusmumriken in pro.lua
Kirill Akulov
Приветствую, как в случае отсутствия модулей подгружать их по мере необходимости? есть тысяча модулей с именами M0, M1 ... M99 внутри которых обязательно определена соответствующая одноимённая глобальная функция. эти модули могут быть использованы из других скриптов, как обойтись без require?
Так, стоп, внутри каждого модуля определена одна глобальная функция?
А почему так? А не склеить ли их все в один файл с кучей функций?
источник

S

Snusmumriken in pro.lua
Прост в твоём случае проще так:
local lib = setmetatable({}, {__index = function(self, k) require(k); self[k] = _G[k]; return self[k] end})
lib.M622("Y30Z10")

Но это всё равно не очень хорошо имхо.
источник

KA

Kirill Akulov in pro.lua
кроме функций ещё могут быть префиксные действия, несовместимые между модулями
источник

KA

Kirill Akulov in pro.lua
нужно грузить только нужные, иногда важен порядок, тогда точно require
источник

S

Snusmumriken in pro.lua
Ужс какой. У тебя есть доступ к файлам-скриптам? Ты можешь их изменять?
источник

S

Snusmumriken in pro.lua
В крайнем случае, оно манки-патчится.
источник

S

Snusmumriken in pro.lua
Типа:
function loadmodule(name)
 1. Ищем файл со скриптом по package.path
 2. Ищем префиксные штуки
 3. Добавляем в начало текста скрипта локальную табличку, сгружаем в неё префиксные штуки
 4. Заменяем имена префиксных штук в функции модуля на табличные, чтобы не пересекалась с другими
 5. Саму функцию тоже пихаем в табличку
 6. Ретурним из модуля табличку и кешируем где-нибудь
end

Скрипты — это текст, и с ними можно работать как с текстом, даже на лету. И будет совершенно пофигу на порядок, нормальные, изолированные друг от друга модули, не какающие в глобальное пространство.

А если можно менять сами файлы — эти же операции можно проделать над каждым скриптом, теми же луями, заменив старую, глобально-какающую версию скрипта на новую, изолированную, нормальную.
источник

KA

Kirill Akulov in pro.lua
менять могу, и планирую. сейчас собираю варианты.
источник

KA

Kirill Akulov in pro.lua
когда я пытаюсь вызвать неопределённую функцию происходит поиск в глобальной таблице?
источник

S

Snusmumriken in pro.lua
Есть таблица _G. Всё что объявлено без local (т.е. глобальное) — направляется туда.
Когда ты пытаешься вызывать неопределённую функцию (или просто неопределённую переменную), луа сначала лезет на разные уровни видимости "выше текущего", а потом — да, в глобальную таблицу _G, в которой хранится всё глобальное.
источник

S

Snusmumriken in pro.lua
Kirill Akulov
менять могу, и планирую. сейчас собираю варианты.
Суть понятна?
источник

S

Snusmumriken in pro.lua
Я даже скрипт накатал по переделке твоих скриптов (если оно там в подобном формате) в правильные:

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)
источник

S

Snusmumriken in pro.lua
Берёшь батник с подобным содержимым:
lua %~dp0/fixer.lua %1 > %1.fixed 2>&1

Пихаешь его в ту же папку что и скрипт (обзови скрипт fixer.lua):
И правишь имя своего луёвого интерпретатора.
После чего, перемещаешь на него файлы скриптов мышкой.
источник

KA

Kirill Akulov in pro.lua
Ок, попробую
источник

S

Snusmumriken in pro.lua
Но бекап на всякий случай всё равно сделай ))
источник

A

Alex in pro.lua
Snusmumriken
Ещё в функции load можно указать конкретную таблицу окружения, то что будет вместо _G. То есть, всё что подгружаемая фигня будет объявлять глобально, будет записываться в указанную тобой таблицу. Ну и сама подгружаемая фигня сможет использовать только указанные в той таблице функции, то есть никаких math/io/gg/load/require по умолчанию там нет. Если ты добавишь — будет.
Как добавить там в область видимости все что исполняется в основном файле?
источник

A

Alex in pro.lua
Подскажите пожалуйста... стал на этом моменте
источник

S

Snusmumriken in pro.lua
local env = setmetatable({}, {__index = _G})
источник

A

Alex in pro.lua
Это в подгружаемом файле?
источник

S

Snusmumriken in pro.lua
Alex
Это в подгружаемом файле?
Это там, где ты задаёшь таблицу окружения. Я её обозвал env, т.е. environment.
источник