Ktlo
-
Публикации
96 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные пользователем Ktlo
-
-
А что произойдет если я попытаюсь обратиться к какой либо несуществующей переменной?
Значит это одна из причин, почему это не следует делать
. А вообще тогда придётся изменить некоторые привычки при написании кода, например делать все переменные локальными, или просто создать отдельную таблицу для такого специфического способа загрузки библиотек. -
А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке term? Т.е. делать заглушку для clear(), read(), setCursor() и т.п.?
Нет, @swg2you имел в виду это:
setmetatable(_G, { __index = function(_G, libName) local lib = require(libName) rawset(_G, libName, lib) return lib end })Теперь, если мы попытаемся вызвать функцию любой из библиотек, то она будет сразу загружаться в ОЗУ, если её там нет. При каждом последующем использовании библиотеки она уже не будет заново загружаться.
-
1
-
-
странно, я попытался в opencomputers, не сработало
Ну я тоже пытался, прямо после ваших слов. На Lua 5.2 и 5.3 всё прекрасно работает.
-
Стоит надеятся, что в opencomputers _G работает так-же
_ENV вон не работаетНе надо дезинформировать людей, _ENV работает. С чего бы он перестал работать?
-
Можно ли на _G повесить метаметод __newindex, и обеспечить таким образом автоматическую загрузку библиотек?
Да. С _G можно взаимодействовать, как с обычной таблицей, на ней будут работать все свойства и методы метатаблицы. Код типа:
variable = 12
Для Lua значит тоже, что и:
_ENV["variable"] = 23 -- или _ENV.variable = 23 -- и почти то же самое _G.variable = 23
_ENV — локальная переменная, которая выступает в роли окружения функции, изначально _G — окружение любой функции, разумеется это можно изменить, просто сменив значение _ENV или создав более локальную _ENV
-
1
-
-
Кстати,а если я напишу
c=require('component') --код идёт дальшеТо среда дополнительно сделает
component = require('component')Так ведь?
Если это так,то появляется лишняя переменная с библиотекой.Которая не используется в программе,но использует память.
Хотя,возможно,сборщик мусора уберёт это,но не сразу.(А вдруг у кого-то памяти есть мало,а требуется много,причём сразу)
В данном случае память особо не тратится, т. к. не библиотека второй раз не загружается с диска, а уже хранится в package.loaded, оттуда и берётся в при вызове require(), следовательно (c == component). То-есть память тратится только на переменную, но не на её значение.
Я использую другой метод, я заставляю сборщик мусора решать за меня, какая библиотека используется, а какая нет. Как известно сборщик мусора удаляет те объекты (таблицы, функции, потоки, userdata) в Lua, которые не используются ни в одной переменной, к которым нет доступа ни откуда. Значит мы можем использовать эту особенность у удалять неиспользуемую библиотеку с помощью метатаблиц:
setmetatable(package.loaded, { __mode = "v" })Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся.
-
2
-
-
lol = require "lol" бла-бла-бла lol = nil бла-бла-бла
Если этим демонстрируется освобождение памяти от модуля "lol", то ничего не выйдет, модуль всё ещё хранится в таблице package.loaded.
Да, я кеп.-
2
-
-
Я если честно не понял, зачем это. Что это даёт, и какая польза от этой программы? Я попробовал запустить ею пустой файл, комп завис.
-
4
-
-
Я так понимаю, что никто не пытался эту библиотеку использовать. Она не работает, не возвращает саму таблицу с функцией в конце. Я это поправил, но сюрпризы не закончились.


-
Слишком честное казино выходит, не хватает при запуске аргумента для управления процентом удачи, который можно установить на 0%

-
4
-
-
Меня смущает вот этот код:
local function stop() local running = false endЧто это? Возможно по-этому у тебя не работает выход, но я стал копать дальше:
... local function run() oldPix = gpu.get(mouseX, mouseY) gpu.set(mouseX, mouseY, "█") local running = true while running do local _, _, key, code = event.pull("key_down") if key == 0 and code == 88 then stop() ...Тайна функции stop() раскрылась. Ты создаёшь в данном случае две разные переменные running, которые не зависят друг от друга. Надо было сделать так:
local running = true local function stop() running = false endи убрать строчку 47 в твоей программе.
Про сдвиг вправо и влево я не знаю, возможно клавиши не правильно указал, мигания основного курсора связано с тем, что term продолжает работать, так что лучше бы ты это сделал через term.
-
Обновление 1.0
- Во-первых версия 1.0! Думаю пора, т. к. нечего тут уже добавлять, только исправлять, если есть баги (надеюсь они кончились).
- Добавлена защита от дурака. Теперь нельзя так:
object.path = {} -- Передаём параметру path значение таблицы (должна быть строка). --Такое действие выдаст вам ошибку. object.n = 6 -- Значение присваивать этому параметру нельзя. --Выдаст ошибку, object.n теперь только читаемое - Исправлен небольшой баг, связанный с чтением массива. Теперь, если при пользовательском вводе допущена ошибка в одном из элементов массива, то массив всё равно прочитается, а ошибочный элемент будет заменён строкой с ошибкой, с номером элемента. Пример ошибки: "#5: couldn't read unregistered type".
Теперь думаю можно выкладывать в репозиторий...
-
3
-
Надо сделать маленькую библиотеку, которая будет скачивать другие библиотеки из этого репозитория на подобии require(). Не буду сейчас объяснять, как это будет работать, но думаю многим понравится. Давно хотелось что-нибудь такое сделать, но репозитория тогда не было.
-
А че ты последние 2 метода написал в фигурных скобках? Это lua же)
И оператор "||"...
Действительно, это же не будет работать. Я не уверен, что вообще скомпилируется. Нужно проверять свой код.
-
На 16 строчке вы два раза меняете метатаблицу у одной и той же таблицы.
Object2 = setmetatable(setmetatable({},Object1),{ __call = function(self) return setmetatable({t=2},self) end })Перепишите вот так:
Object2 = setmetatable({},Object1)Метаметод __call в таком случае у вас не перепишется, да и зачем?
Если вам всё же необходимо это сделать, то вот решение:Object2 = setmetatable({}, { __index = Object1; __call = function(self) return setmetatable({t=2},self) end; })-
3
-
-
Можешь проверить интервал сам с помощью:
setmetatable({},{__gc=function()print("Произошла очистка памяти")end})Вставь это в какую-нибудь программу или попробуй в интерпретаторе.
Интервал разным будет, разумеется.
-
Такое впечатление возникло, что я смотрю на программу для Windows 10. Похоже Мелкомягкие переборщили с минимализмом.
А вообще выглядит красиво
, напоминает реальный Photoshop.-
2
-
-
Обновление 0.4
- Исправлена автоматическая корректировка строк у методов object:set() и object:setLine().
- Добавил пример использования библиотеки.
-
2
- Исправлена автоматическая корректировка строк у методов object:set() и object:setLine().
-
Обновление 0.3
- Исправлен метод object:set(), а то он после обновления 0.2 вообще перестал работать.
- Добавлен особый вывод для стандартной функции tostring().
- Скоро добавлю пример пользования библиотекой.
-
2
- Исправлен метод object:set(), а то он после обновления 0.2 вообще перестал работать.
-
Вообще-то можно...
Ну ладно, в принципе можно, если изменить конфиги. Появляется другая проблема, как сериализовать? Можно изучить байт код Lua, и основываясь на том, что это за userdata попытаться воссоздать её в байт коде. Но кто этим заниматься будет?
Хотелось бы по конкретнее, какой userdata нужно сохранить. Вдруг всё очень просто, а мы ходим вокруг да около.
-
Оу, так это не получится... Поэтому мне и нужно как-то вырезать байты памяти и после ребута воткнуть их назад.
Ну тогда никак, в OC запрещено юзать байткод.
-
Здесь надо подумать логически. Какие ключевые переменные образуют userdata, т.к. нельзя никаким образом сериализовать его, значит нужно сохранить информацию, с помощью которой ты снова сможешь создать этот объект типа userdata.
-
То есть если мы не указали X, то тогда автоматический блок рисуется по центру? Нет-нет))
А чего так? Пользователю писать лишнего не придётся, да и тем более, в других местах это широко применяют. Думаю будет удобно.
-
По-моему в автоматический выбор лучше делать, когда значение не указано. Таким образом пользователю не придётся писать лишнее.

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