cyber01 1 704 Опубликовано: 12 января, 2016 А что за новое слово Licenze? И зачем было переводить текст лицензии (название) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov Автор темы 34 Опубликовано: 12 января, 2016 И зачем было переводить текст лицензии (название) Вдруг кто-то англ не знает) Licenze xD, исправил) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 398 Опубликовано: 12 января, 2016 License: Licenze: Да ты про в инглише! Ах, да, читаемость кода просто зашибись. http://lua-users.org/wiki/LuaStyleGuide Можете не благодарить. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 900 Опубликовано: 12 января, 2016 (изменено) Отлично! Дело за малым. Накидать код который будет цеплять на _G метаметод подгрузки запрашиваемой библиотеки, и запихнуть его в автозагрузку. И с require() можно прощаться. Давно так делал, через init.lua происходило добавление. Правда, в таких случаях в память может грузануться крайне прожорливая либа, которую ты в данном контексте даже использовать не собираешься (например, двойной буфер требует 200 кбайт оперативки), а это в некоторых ситуациях критично. В конце концов немного переосмыслил ситуацию и подгружаю библиотеки во все то же _G пространство через такой вот незамысловатый цикл: -- Адаптивная загрузка необходимых библиотек и компонентов local libraries = { ecs = "ECSAPI", component = "component", event = "event", term = "term", config = "config", context = "context", buffer = "doubleBuffering", image = "image", SHA2 = "SHA2", } local components = { gpu = "gpu", } for library in pairs(libraries) do if not _G[library] then _G[library] = loadfile(libraries[library])() end end for comp in pairs(components) do if not _G[comp] then _G[comp] = _G.component[components[comp]] end end libraries, components = nil, nil Изменено 12 января, 2016 пользователем ECS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov Автор темы 34 Опубликовано: 12 января, 2016 Обновил среду и инсталлер, теперь есть поддержка инструкции with(some)do someMethod() end --some.someMethod() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 12 января, 2016 Прочитал и посты ниже, очень интересная идея, но с одним недостатком: имхо это не очень эффективно, ведь обращение к local-переменной осуществляется быстрее и было бы лучше создать такую переменную на стадии инициализации(как в моей среде), а не юзать поле таблицы _G Давно так делал, через init.lua происходило добавление. Правда, в таких случаях в память может грузануться крайне прожорливая либа, которую ты в данном контексте даже использовать не собираешься (например, двойной буфер требует 200 кбайт оперативки), а это в некоторых ситуациях критично. В конце концов немного переосмыслил ситуацию и подгружаю библиотеки во все то же _G пространство через такой вот незамысловатый цикл: Я говорил немного не о том. Суть идеи не в том, что при старте ОС превентивно подгружать библиотеки, а в том, что для существующих библиотек в глобальном окружении создаются пустые индексы (заглушки) с маленькой мета-функцией. В результате: При запуске ОС, в память не загружается ни одна лишняя библиотека. Затраты памяти только на двухстрочную функцию. При попытке вызова заглушки, например term.clear(), произойдет автоматический вызов require("term"). Т.е. загрузка нужной библиотеки будет происходить автоматически, при попытке доступа к ней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 900 Опубликовано: 13 января, 2016 Суть идеи не в том, что при старте ОС превентивно подгружать библиотеки, а в том, что для существующих библиотек в глобальном окружении создаются пустые индексы (заглушки) с маленькой мета-функцией. А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке term? Т.е. делать заглушку для clear(), read(), setCursor() и т.п.? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ktlo 789 Опубликовано: 13 января, 2016 (изменено) А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке term? Т.е. делать заглушку для clear(), read(), setCursor() и т.п.? Нет, @swg2you имел в виду это: setmetatable(_G, { __index = function(_G, libName) local lib = require(libName) rawset(_G, libName, lib) return lib end }) Теперь, если мы попытаемся вызвать функцию любой из библиотек, то она будет сразу загружаться в ОЗУ, если её там нет. При каждом последующем использовании библиотеки она уже не будет заново загружаться. Изменено 13 января, 2016 пользователем Ktlo 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 13 января, 2016 swg2you имел в виду это: setmetatable(_G, { __index = function(libName) rawset(_G, libName, require(libName)) end }) Теперь, если мы попытаемся вызвать функцию любой из библиотек, то она будет сразу загружаться в ОЗУ, если её там нет. При каждом последующем использовании библиотеки она уже не будет заново загружаться. А что произойдет если я попытаюсь обратиться к какой либо несуществующей переменной? Например напишу так: a=b Даже если переменная b ранее не была определена, это вполне валидный код. Просто переменной a будет присвоен nil. Но что произойдет если будет установлена предлагаемая метатаблица? Система попытается подгрузить библиотеку с именем "b" и вывалится с ошибкой. Т.е. надо надо контролировать, является ли запрашиваемая библиотека действительно библиотекой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ktlo 789 Опубликовано: 13 января, 2016 А что произойдет если я попытаюсь обратиться к какой либо несуществующей переменной? Значит это одна из причин, почему это не следует делать . А вообще тогда придётся изменить некоторые привычки при написании кода, например делать все переменные локальными, или просто создать отдельную таблицу для такого специфического способа загрузки библиотек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 13 января, 2016 (изменено) А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке term? Т.е. делать заглушку для clear(), read(), setCursor() и т.п.? Ноп. В Lua всё должно быть гораздо проще и изящней. _G.term = {} setmetatable(term, {__index = function(t,k) setmetatable(t,{__index=require("term")}) return t[k] end}) Как-то так. Теперь, при первой попытке доступа к индексам term (а индексов там никаких нет, таблица то пуста) будет вызвана двухстрочная функция, которая вызовет require, результат выполнения присвоит метаметоду, затерев себя, чтобы больше не вызываться, и вернет ссылку на уже существующий индекс. P.S. Казалось, можно было бы еще проще: _G.term = {} setmetatable(term, {__index = require("term")}) Но в этом случае require будет вызван на стадии присвоения. Т.е. метаметоду будет присовен результат выполнения require, а не сама функция, и финт теряет смысл. upd: Пока я боролся с редактором, вы тут уже понаписали ) upd2: Вешать на глобал, думаю, не очень хорошо. Просто, красиво, но нет контроля. Все реквайрится под одну гребенку. Заглушки удобнее. Можно сделать что-то типа libinit.lua который будет финдфайл существующие библиотеки и вешать заглушки и/или из параметров ком.строки брать. Изменено 13 января, 2016 пользователем swg2you Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 900 Опубликовано: 13 января, 2016 (изменено) В Lua всё должно быть гораздо проще и изящней. _G.term = {} setmetatable(term, {__index = function(t,k) setmetatable(t,{__index=require("term")}) return t[k] end}) Ну так я и говорю: придется вручную делать некую программку, вешающую на _G указанный перечень библиотек. А ведь можно, кстати, через fs.list() получить список файлов в папке с либами и через цикл создавать метаметоды, как указал swg2you выше - это будет куда удобнее. Правда, в этом случае уже не получится сделать кастомное сокращение библиотек (fs = filesystem, rs = redstone, r = robot и т.д.) for file in filesystem.list("lib/") do _G[file] = {} setmetatable([file], {__index = require(file)}) end Изменено 13 января, 2016 пользователем ECS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 13 января, 2016 Ну так я и говорю: придется вручную делать некую программку, вешающую на _G указанный перечень библиотек. А ведь можно, кстати, через fs.list() получить список файлов в папке с либами и через цикл создавать метаметоды, как указал swg2you выше - это будет куда удобнее. Правда, в этом случае уже не получится сделать кастомное сокращение библиотек (fs = filesystem, rs = redstone, r = robot и т.д.) for file in filesystem.list("lib/") do _G[file] = {} setmetatable([file], {__index = require(file)}) end Об этом и речь. Только не этот вариант заглушки, а первый, который с функцией. Этот тоже будет работать, но по сути это будет превентивная загрузка. А назначать псевдонимы библиотекам (local fs = filesystem, и т.п.) можно будет после первого вызова библиотечной функции. Да и первый вызов можно делать назначением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov Автор темы 34 Опубликовано: 14 января, 2016 (изменено) Т.е. надо надо контролировать, является ли запрашиваемая библиотека действительно библиотекой. Я понимаю, что мой код не очень читаем, но можно было поинтересоваться/, как это реализовано у меня: итерируются имена файлов из /lib/, добавляются в массив, потом эти вхождения ищутся в тексте программы(в вашем случае проверять при каждом обращении к свойствам глобала, но лучше просто засунуть в pcall) через fs.list() получить список файлов в папке с либами и через цикл создавать метаметоды, как указал swg2you выше - это будет куда удобнее. Не дочитал) Но pcall все равно в приоритете. Изменено 14 января, 2016 пользователем SergOmarov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ktlo 789 Опубликовано: 14 января, 2016 ...итерируются имена файлов из /lib/... По-моему лучше искать имена библиотек во всех директориях, которые указаны в package.path, там прописана не только /lib/, а ещё и другие места, также это даст возможность изменить место поиска этих библиотек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov Автор темы 34 Опубликовано: 16 января, 2016 да, лучше так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах