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

swg2you

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

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

  • Посещение

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

    20

Все публикации пользователя swg2you

  1. Я далек от ООП, но думаю, что как-то так.setmetatable(obj1, {__index=ro1,__newindex=function(t,k,v) local _=rawget(ro1,k) or rawset(t,k,v) end}) setmetatable(obj2, {__index=ro2,__newindex=function(t,k,v) local _=rawget(ro2,k) or rawset(t,k,v) end}) Или по твоему коду: Class={a=1, b=2} function Class:new() local obj={c=3, d=4} local nc={} for k,v in pairs(self) do nc[k]=v end setmetatable(obj,{__index=nc,__newindex=function(t,k,v) local _=rawget(nc,k) or rawset(t,k,v) end}) return obj end function Class:ShowFields() prn(self.a, self.b, self.c, self.d) end function Class:SetA(Val) rawset(self,'a',Val) end function Class:SetB(Val) rawset(self,'b',Val) end obj = Class:new() obj2 = Class:new() obj:ShowFields() obj.a=5 obj.b=6 obj.c=7 obj.d=8 obj:ShowFields() obj:SetA(5) obj:SetB(6) obj:ShowFields() obj2:ShowFields() Если я правильно понял, что тебе от этого кода нужно.
  2. ro = {a=1, b=2} obj = {b=3, c=4} setmetatable(obj,{__index=ro,__newindex=function(_,_,_)end}) prn(obj.a, obj.b, obj.c) -->1 3 4 (значение obj.b=3 установленное до объявления метаметодов перекрывает ro.b=2, и __index=ro не вызывается. obj.a=5 obj.b=6 obj.c=7 prn(obj.a, obj.b, obj.c) -->1 6 7 (obj.a=5 выполнил function(_,_,_)end ничего не сделав) Эта строка setmetatable(obj, {__index=ro, __newindex=function(_,_,_)end}) говорит следующее: Для несуществующих индексов таблицы obj, читать значения из ro, а при попытке записи выполнять ничего - function(_,_,_)end Или так: setmetatable(obj,{__index=ro,__newindex=function(t,k,v) print('Иди в пень! '..k..' ' - ридонли!') end}) --===-- При попытке добавления нового значения (например obj.d=8) выполнится ничего и значение добавлено не будет. Чтобы мы могли добавлять новые индексы в obj нужно в нашем ничего проверять, есть ли добавляемый индекс в ro, и если такого индекса нет, то добавлять его в obj. Это можно сделать так: setmetatable(obj, {__index=ro,__newindex=function(t,k,v) local _=rawget(ro,k) or rawset(t,k,v) end}) При попытке записи obj.d=8, наше ничего, сделает: если не ro.k то rawset(t,k,v) наплевав на всякие там метаметамета. Теперь мы можем: ro = {a=1, b=2} obj = {b=3, c=4} setmetatable(obj,{__index=ro,__newindex=function(t,k,v) local _=rawget(ro,k) or rawset(t,k,v) end}) prn(obj.a, obj.b, obj.c, obj.d) obj.a=5 obj.b=6 obj.c=7 obj.d=8 prn(obj.a, obj.b, obj.c, obj.d) upd:Прочел следующие посты и понял, как я далек от объектно-ориентированного програмирования )
  3. Выход/вылет/warp - одним/обеими игроками - как обрабатывать?
  4. 2@Krutoy >...А что, слабо написать ось на 4к памяти? 34816 бит, без учета "имени", это довольно много. 2@LeshaInc >...И писать на биосе по мне --- тупиковая ветвь развития... тупиковая - не писать. 2@Fingercomp >...ОСь загруженная в темпе из инета (и/или по ОпенНет) и запускаемая из-под биоса... Интересно) Биос такой, - Сосед, а сосед, ты один пинганулся на этом порту, а дай мне код операционки, чтоб я в инет сам не лез! - Ты офигел? я вообще-то дрон и у меня ос, из других модулей состоит. Хочешь дроном стать? - Дроном мне не судьба. Максимум - роботом, - Рожденный ползать... - как там говорится. - Летать не может, - там говорится. - Ну слетай к кому нибудь, принеси, а? - Ага, щас. С инета тяни. Или жди пока еще кто из твоей породы проснется и потянет. - Так хозяин инет-карту куда й то запропастил. Вчерась еще была, а сегодня - тык, - нету! 2@Zer0Galaxy >...Это должна быть резидентная программа,... как минимум две.
  5. Полагаю что это быстрая сортировка, и некоторые источники утверждают так-же. Но если не верится, можно глянуть в исходниках Lua.
  6. Ок, ок. Прости за грубость. Спор действительно на пустом месте. Пойду я, а то у меня еще мой коблоужас на сервере не достроен. Еще рас прошу извинить и, надеюсь, мир?
  7. Интересное применение рекурсии. Написание своей функции сортировки полезно, как минимум, для изучения применения рекурсии в алгоритмах сортировки. Но на практике, я предпочитаю встроенную table.sort local arr={1,3,6,2,7,4,8,9,5} print(table.unpack(arr)) --по возрастанию table.sort(arr) print(table.unpack(arr)) --по убыванию, или по своему признаку table.sort(arr,function(a,b) return a>b end) print(table.unpack(arr))
  8. Ух приставучий. Иди учись. Не трать моё время!
  9. Пожалуйста, чувак ) upd: перенес дополнение в первый пост
  10. Это "алгоритм ближайшего соседа" решающий "задачу коммивояжера" которая, в свою очередь, является частным случаем "задачи о кратчайшем пути". Так что насчет велосипедов - неясно ) К слову, "алгоритм ближайшего соседа" простой, но очень неэффективный. "муравьями" решать эту задачу намного лучше.
  11. Подмена computer.pullSignal или методика построения резидентных программ в OpenOS Допустим, захотелось нам иметь резидентную программу, которая будет работать на фоне OpenOS и, периодически, или по какому либо событию, что-то полезное делать. Воспользуемся нашим маленьким bibi, а в качестве boot.lua напишем такой код: local cl=component.list local gp=component.proxy(cl("gpu")()) --сохраняем исходные функции из _G.computer, для внутреннего пользования local cp={} for k,v in pairs(computer) do cp[k]=v end --подменяем функцию computer.pullSignal computer.pullSignal = function (...) local e={cp.pullSignal(...)} --для примера, по тильде (~) будем ребутать компьютер if e[1]=='key_down' and e[4]==41 then cp.shutdown(true) end --а по lAlt будем выводить список компонентов используя определенную в OpenOS функцию print и сохраненную cl if e[1]=='key_down' and e[4]==56 then for k,v in cl() do print(k,v) end end --OpenOS периодически сама дергает эвенты (чтобы курсор мигал и прочее) подробнее смотрите в lib/event.lua --поэтому мы можем выводить свои часики, куда-ж без них то ) и прочие полезности, например инфу о памяти local s=tostring(math.floor(cp.freeMemory()/1024))..'/'..tostring(cp.totalMemory()/1024)..' kb free '..os.date('!%R') local w,h = gp.maxResolution() gp.set(w-#s+1,1,s) --в конце мы должны вернуть событие ничего не подозревающей OpenOS return table.unpack(e) end --функцию мы подменили, теперь загружаем, компилируем и выполняем init.lua local fs=component.proxy(computer.getBootAddress()) local h=fs.open('init.lua') local s,r='','' while r do r=fs.read(h,math.huge) s=s..(r or "") end fs.close(h) load(s)() Запускаем компьютер, bibi пискнув и подождав секундочку, выполняет наш boot.lua, который хитро подменив pullSignal выполнит init.lua и после загрузки OpenOS в углу экрана радостно затикают часики. Теперь мы можем нажать lAlt и лицезреть список компонентов, или нажать тильду, и компьютер перезапустится. --==-- Конечно, вы можете сказать, что вывод списка компонентов портит экран, что перед выводом хорошо бы сохранять состояние экрана каким-нибудь gpu.get, вывод делать в свой интерфейс, а после, восстанавливать экран. И часики у меня никудышние. При скролле вниз (например в редакторе edit.lua) скроллируются вместе с текстом, вместо того, чтобы оставаться там где им положено. Но моя задача, показать метод на простейших примерах, а не переопределяя gpu строить интерфейсы. На основе этого метода можно построить API для TSR программ, а комбинируя его с перехватом component.proxy, component.invoke и последующей подменой gpu на виртуальный терминал, и вовсе, написать свою операционную систему. Для которой, кстати говоря, было бы неплохо уметь запускать OpenOS в окошке, но самое главное, в изолированной среде, чтобы труд программистов писавших ПО под OpenOS не пропадал зря. Я бы даже сказал, что изоляция OpenOS, на данном этапе, более важная задача, чем построение интерфейсов. Поэтому мы попробуем разобрать эту проблему в следующей статье. Посмотрим что выйдет. --==-- Небольшое дополнение: Если вам не охота играть с bibi, но нужно запустить резидентную программу прямо из-под OpenOS, то это сделать еще проще. local component = require("component") local cp = require("computer") local gpu = component.gpu local pullSignal = cp.pullSignal cp.pullSignal = function (...) local e={pullSignal(...)} if e[1]=='key_down' and e[4]==41 then cp.shutdown(true) end if e[1]=='key_down' and e[4]==56 then for k,v in component.list() do print(k,v) end end local s=' '..math.floor(cp.freeMemory()/1024)..'/'..(cp.totalMemory()/1024)..' kb free '..os.date('!%R') local w,h = gpu.maxResolution() gpu.set(w-#s+1,1,s) return table.unpack(e) end Сохраняем этот код в файл, допустим tsr.lua и запускаем его под OpenOSПрограмма выполнится, завершится, а резидентный участок останется в памяти. --==-- Если выбросить все что относится к демонстрации работы, у нас останется маленькая обертка local cp = require("computer") local pullSignal = cp.pullSignal cp.pullSignal = function (...) local e={pullSignal(...)} --код TSR программы return table.unpack(e) end Заключив в которую код своей TSR программы мы получим резидента, который будет выполнять TSR-код, где-то раз в пол секунды.
  12. Цитаты из wikipedia.org: "Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду." "Результатом работы компилятора может быть программа на специально созданном низкоуровневом языке, подлежащем интерпретации виртуальной машиной. Такой язык называется псевдокодом или байт-кодом." "Интерпрета́ция — пооператорный (покомандный, построчный) анализ, обработка и тут же выполнение исходной программы или запроса (в отличие от компиляции, при которой программа транслируется без её выполнения)" Цитата из описания load в официальной документации на lua.org: "If there are no syntactic errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message." Своими словами: load - компилирует текст программы в байт-код. Ком-пи-ли-ру-ет! Поэтому его ошибки это ошибки ком-пи-ля-ци-и. А когда мы будем выполнять наш байт код, через pcall, или просто добавив скобочки обратимся к нему как к функции, вот тогда уже будет происходить интерпретация байт кода с его выполнением. --==-- Брысь отсюда! ) Идите маны покурите и матчасть почитайте если нечего по делу сказать. Ишь ты, какие критиканы! Или самосожгитесь там, на костре из собственного невежества, самоуверенности и слепых заблуждений. )
  13. Писать программы для eeprom - то еще занятие. Попробуем облегчить этот процесс. в \config\OpenComputers.cfg устанавливаем bufferChanges=false Это отключит буферизацию, и все изменения файлов в каталогах сохранения будут немедленно отображены внутри игрыЗагружаем игру в сингл, строим себе базу, ставим там компьютер, и инсталлируем на него OpenOS.После этого, в каталоге \saves\%save_name%\opencomputers\ появится UID нашего виртуального "винчестера", со всем содержимымЗаписываем туда файл bibi local gpu = component.proxy(component.list("gpu")()) gpu.bind(component.list("screen")()) local cy=1 prn=function(...) local t={...} for i=1,#t do t[i]=tostring(t[i]) end gpu.set(1,cy,table.concat(t, ' ')) cy=cy+1 end local readfile=function(f) for addr in component.list("filesystem") do local fs=component.proxy(addr) local h=fs.open(f) if h then --костыль для init.lua computer.getBootAddress=function() return addr end local s,r='','' while r do r=fs.read(h,math.huge) s=s..(r or "") end fs.close(h) return s,f end end end prn('bibi: press a key to force init.lua') computer.beep(440) local s,f=readfile('boot.lua') if ({computer.pullSignal(1)})[1]=='key_down' or not s then s,f=readfile('init.lua') end if s then local r,e=load(s,f) if r then r,e=pcall(r) end prn('bibi:', r, e) else prn('bibi: no file') end prn('bibi: press a key to reboot') repeat until ({computer.pullSignal()})[1]=='key_down' computer.shutdown(true) И файл boot.lua prn('Hello world', nil~=false) После чего в OpenOS делаем: flash -q bibi bibi reboot Наблюдаем наш хелловорлд и убеждаемся, что nil и false - это две большие разницы: Теперь открываем наш boot.lua в блокноте или в чем вам удобно писать код, разминаем мозги и пальцы и погружаемся в процесс творчества. В одном окне блокнот с кодом, в другом - майнкрафт с нашим виртуальным компьютером. Написали-сохранили-проверили. --- Ошибки компиляции нашего кода будут выглядеть так: Ошибки выполнения так: А если нам захочется в OpenOS то мы нажмем секретную кнопку "а кей" когда наш bibi пискнет при старте.Также в OpenOS мы попадем если bibi не найдет файла boot.lua. А если и init.lua не найдет, то скажет "no file" и будет ждать когда мы исправим ситуацию ЗЫ Не злоупотребляйте prn(), она очень служебная и не умеет scroll, конечно scroll это всего лишь условие и две строки, но зачем?! Пишите свои prn-ы с преферансом и барышнями, предварительно поиграв ну хотя-бы с таким вот хелловорлдом:
  14. Если в 100 раз уменьшен износ инструмента, то получается что даже золотые кирки зачаровывать целесообразно?
  15. Ребятки, критикуя не поняв сути вы выглядите глупо.
  16. Разве? Строишь граф: Блоки руды = узлы Вес рёбер = количество энергии для перемещения робота в узел Алгоритм пробегает по этому графу и выдает "кратчайший" путь который и будет самой эффективной "жилой" с точки зрения затрат энергии. Если нужно минимизировать время - то в качестве веса рёбер бери время телодвижений робота. Если нужно минимизировать расстояние - то расстояние. Какой параметр выберешь в качестве веса ребра по тому параметру и будет проводиться оптимизация.
  17. Эм. Мы недопоняли друг-друга, код который я привел скопирован из кода страницы а не из редактора. Редактор был в стандартном режиме, я отредактировал сообщение, оформив список багофич в виде маркированного списка, и после сохранения маркированный список разъехался. Редактор почему-то добавил к каждому элементу списка тег <br> <li>- computer.shutdown(true) - не работает</li><br /> А псевдо-html режим по первой кнопке - работает лучше чем wysiwyg.
  18. Ну, её ж еще найти эту кнопку нужно, и ткнуть догадаться )
  19. А хотя бы этим: <p>Из замеченных багофич:</p> <ul><li>- Перепрошивка eeprom не сохраняется после рестарта (спасает подмена файла)</li><br /> <li>- при старте генерит события component_added для всех частей, чего на реальном OC не происходит</li><br /> <li>- computer.shutdown(true) - не работает</li><br /> <li>- os.date('!%R') - не работает</li><br /> <li>- клавиша '~' - генерит событие с неправильным кодом</li><br /> <li>- события clipboard, drag, drop, scroll не генерятся</li><br />
  20. !%R - секунд не дает os.date('!%R') --> 18:25 а если время замедленно и 1 игровая минута==10 секунд, тогда вызов раз в секунду действительно, более чем достаточен.
  21. Как не время? То что оно идет неравномерно относительно нас, ничего не значит. Солнце/луна движутся, день сменяет ночь, внутриигровое время тикает. Или на сервере время отсутсвует как класс? о_О зы аж побежал смотреть от любопытства, но не смотря на выданную кирку, застрял на стадии авторизации в лаунчере )
×
×
  • Создать...