Перейти к содержимому
SergOmarov

The A Environment

Рекомендуемые сообщения

А что за новое слово Licenze?

И зачем было переводить текст лицензии (название)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

И зачем было переводить текст лицензии (название)
 

Вдруг кто-то англ не знает)


 

 

Licenze
 

xD, исправил)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

License: Licenze:

Да ты про в инглише!

 

Ах, да, читаемость кода просто зашибись.

http://lua-users.org/wiki/LuaStyleGuide

Можете не благодарить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Отлично!  Дело за малым. Накидать код который будет цеплять на _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
Изменено пользователем ECS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обновил среду и инсталлер, теперь есть поддержка инструкции with(some)do someMethod() end --some.someMethod()

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прочитал и посты ниже, очень интересная идея, но с одним недостатком: имхо это не очень эффективно, ведь обращение к local-переменной осуществляется быстрее и было бы лучше создать такую переменную на стадии инициализации(как в моей среде), а не юзать поле таблицы _G

 

Давно так делал, через init.lua происходило добавление. Правда, в таких случаях в память может грузануться крайне прожорливая либа, которую ты в данном контексте даже использовать не собираешься (например, двойной буфер требует 200 кбайт оперативки), а это в некоторых ситуациях критично. В конце концов немного переосмыслил ситуацию и подгружаю библиотеки во все то же _G пространство через такой вот незамысловатый цикл:

Я говорил немного не о том.

 

Суть идеи не в том, что при старте ОС превентивно подгружать библиотеки, а в том, что для существующих библиотек в глобальном окружении создаются пустые индексы (заглушки) с маленькой мета-функцией.

 

В результате:

  • При запуске ОС, в память не загружается ни одна лишняя библиотека. Затраты памяти только на двухстрочную функцию.
  • При попытке вызова заглушки, например term.clear(), произойдет автоматический вызов require("term").

Т.е. загрузка нужной библиотеки будет происходить автоматически, при попытке доступа к ней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Суть идеи не в том, что при старте ОС превентивно подгружать библиотеки, а в том, что для существующих библиотек в глобальном окружении создаются пустые индексы (заглушки) с маленькой мета-функцией.

 

А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке term? Т.е. делать заглушку для clear(), read(), setCursor() и т.п.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке term? Т.е. делать заглушку для clear(), read(), setCursor() и т.п.?

Нет, @swg2you имел в виду это:

setmetatable(_G, {
    __index = function(_G, libName)
        local lib = require(libName)
        rawset(_G, libName, lib)
        return lib
    end
})

Теперь, если мы попытаемся вызвать функцию любой из библиотек, то она будет сразу загружаться в ОЗУ, если её там нет. При каждом последующем использовании библиотеки она уже не будет заново загружаться.

Изменено пользователем Ktlo

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

swg2you имел в виду это: setmetatable(_G, { __index = function(libName) rawset(_G, libName, require(libName)) end }) Теперь, если мы попытаемся вызвать функцию любой из библиотек, то она будет сразу загружаться в ОЗУ, если её там нет. При каждом последующем использовании библиотеки она уже не будет заново загружаться.

А что произойдет если я попытаюсь обратиться к какой либо несуществующей переменной? Например напишу так:

a=b 

Даже если переменная b ранее не была определена, это вполне валидный код. Просто переменной a будет присвоен nil.

Но что произойдет если будет установлена предлагаемая метатаблица? Система попытается подгрузить библиотеку с именем "b" и вывалится с ошибкой. Т.е. надо надо контролировать, является ли запрашиваемая библиотека действительно библиотекой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что произойдет если я попытаюсь обратиться к какой либо несуществующей переменной?

Значит это одна из причин, почему это не следует делать  :). А вообще тогда придётся изменить некоторые привычки при написании кода, например делать все переменные локальными, или просто создать отдельную таблицу для такого специфического способа загрузки библиотек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке 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 который будет финдфайл существующие библиотеки и вешать заглушки и/или из параметров ком.строки брать.

Изменено пользователем swg2you

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 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
Изменено пользователем ECS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Ну так я и говорю: придется вручную делать некую программку, вешающую на _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, и т.п.) можно будет после первого вызова библиотечной функции. Да и первый вызов можно делать назначением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Т.е. надо надо контролировать, является ли запрашиваемая библиотека действительно библиотекой.

 

Я понимаю, что мой код не очень читаем, но можно было поинтересоваться/, как это реализовано у меня: итерируются имена файлов из /lib/, добавляются в массив, потом эти вхождения ищутся в тексте программы(в вашем случае проверять при каждом обращении к свойствам глобала, но лучше просто засунуть в pcall)

 

 

через fs.list() получить список файлов в папке с либами и через цикл создавать метаметоды, как указал swg2you выше - это будет куда удобнее.

 

Не дочитал) Но pcall все равно в приоритете.

Изменено пользователем SergOmarov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

...итерируются имена файлов из /lib/...

По-моему лучше искать имена библиотек во всех директориях, которые указаны в package.path, там прописана не только /lib/, а ещё и другие места, также это даст возможность изменить место поиска этих библиотек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...