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

Ktlo

Пользователи
  • Публикации

    96
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные пользователем Ktlo


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

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


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

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


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

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

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

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

    • Нравится 1

  4. Можно ли на _G повесить метаметод __newindex, и обеспечить таким образом автоматическую загрузку библиотек?

    Да. С _G можно взаимодействовать, как с обычной таблицей, на ней будут работать все свойства и методы метатаблицы. Код типа:

    variable = 12
    

    Для Lua значит тоже, что и:

    _ENV["variable"] = 23
    -- или
    _ENV.variable = 23
    -- и почти то же самое
    _G.variable = 23
    

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

    • Нравится 1

  5. Кстати,а если я напишу

    c=require('component')
    --код идёт дальше
    

    То среда дополнительно сделает 

    component = require('component')
    

    Так ведь?


    Если это так,то появляется лишняя переменная с библиотекой.Которая не используется в программе,но использует память.

    Хотя,возможно,сборщик мусора уберёт это,но не сразу.(А вдруг у кого-то памяти есть мало,а требуется много,причём сразу)

    В данном случае память особо не тратится, т. к. не библиотека второй раз не загружается с диска, а уже хранится в package.loaded, оттуда и берётся в при вызове require(), следовательно (c == component). То-есть память тратится только на переменную, но не на её значение.

    Я использую другой метод, я заставляю сборщик мусора решать за меня, какая библиотека используется, а какая нет. Как известно сборщик мусора удаляет те объекты (таблицы, функции, потоки, userdata) в Lua, которые не используются ни в одной переменной, к которым нет доступа ни откуда. Значит мы можем использовать эту особенность у удалять неиспользуемую библиотеку с помощью метатаблиц:

    setmetatable(package.loaded, { __mode = "v" })
    

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

    • Нравится 2

  6. lol = require "lol"
    бла-бла-бла
    lol = nil
    бла-бла-бла

    Если этим демонстрируется освобождение памяти от модуля "lol", то ничего не выйдет, модуль всё ещё хранится в таблице package.loaded. Да, я кеп.

    • Нравится 2

  7. Я так понимаю, что никто не пытался эту библиотеку использовать. Она не работает, не возвращает саму таблицу с функцией в конце. Я это поправил, но сюрпризы не закончились.

    0_14ee42_e5eb52ca_orig.png0_14ee43_b49180bc_orig.png

     


  8. Меня смущает вот этот код:

    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.


  9. Обновление 1.0

    • Во-первых версия 1.0! Думаю пора, т. к. нечего тут уже добавлять, только исправлять, если есть баги (надеюсь они кончились).
    • Добавлена защита от дурака. Теперь нельзя так:
      object.path = {} -- Передаём параметру path значение таблицы (должна быть строка).
      --Такое действие выдаст вам ошибку.
      
      object.n = 6 -- Значение присваивать этому параметру нельзя.
      --Выдаст ошибку, object.n теперь только читаемое
      
    • Исправлен небольшой баг, связанный с чтением массива. Теперь, если при пользовательском вводе допущена ошибка в одном из элементов массива, то массив всё равно прочитается, а ошибочный элемент будет заменён строкой с ошибкой, с номером элемента. Пример ошибки: "#5: couldn't read unregistered type".

     

    Теперь думаю можно выкладывать в репозиторий...

    • Нравится 3

  10. Надо сделать маленькую библиотеку, которая будет скачивать другие библиотеки из этого репозитория на подобии require(). Не буду сейчас объяснять, как это будет работать, но думаю многим понравится. Давно хотелось что-нибудь такое сделать, но репозитория тогда не было.


  11. На 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

  12. Вообще-то можно... 

    Ну ладно, в принципе можно, если изменить конфиги. Появляется другая проблема, как сериализовать? Можно изучить байт код Lua, и основываясь на том, что это за userdata попытаться воссоздать её в байт коде. Но кто этим заниматься будет?

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


  13. Здесь надо подумать логически. Какие ключевые переменные образуют userdata, т.к. нельзя никаким образом сериализовать его, значит нужно сохранить информацию, с помощью которой ты снова сможешь создать этот объект типа userdata.

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