swg2you
-
Публикации
219 -
Зарегистрирован
-
Посещение
-
Победитель дней
20
Сообщения, опубликованные пользователем swg2you
-
-
Моя в детстве игрался таким.
Страстная машина!
-
Вы предлагаете мне сжать код?Ноп. Оставил только в качестве условного примера реализации. С мыслью, - Возможно это будет вам полезно.
-
1
-
-
--код 94 байта: C=component::R::C.proxy(C.list('od')()).open(7)E={computer.pullSignal()}load(E[9]or'')()goto RПозволяет удаленно выполнять программы на любых устройствах в которые вставлен EEPROM с этим кодом
Здесь: вся тема
Здесь: подробный разбор кода с комментариями
P.s.
Писал давно, возможно требуется модификация.
Оставляю в качестве примера.
-
5
-
-
Собственно сабж:

Про́со (лат. Panicum) — род однолетних и многолетних травянистых растений семейства Злаки, или Мятликовые (Poaceae).При создании этой темы вписывал тег "ошибка", но после нажатия "б" тег завершается, будто бы ентер тыкнул.

ЧЯДНТ?
Ткнул на кнопку в теме смотреть результаты не голосуя, и теперь я не могу проголосовать и видеть предыдущие голоса.

Требую медаль великаго тостера!
-
скачивать их программой, после того, как пользователь выберет язык?имхо обновление языковых пакетов с онлайн репозитория - самое правильное решение.
-
Зачот. Ждем программу для робота, которая будет высекать хеловорды в толще породы.И не говори. Программисты вечно всё усложняют.
-
2
-
-
Дратути!
Программисты такие программисты

Скопировать Hello World! в буфер, запустить цомпутер в майне и прямо в командной строке 10 раз нажать инсерт. Фомально условия ТЗ выполнены, т.к. ОС на Луа обрабатывает ввод/вывод.
Можно еще с echo извратиться. Как в древней бородатой задачке.
ЗЫ
Есть еще медитативно-хаотический метод для истинных гуру, выводить в поток рандомные символы. Рано или поздно фраза Hello World! будет выведена 10 раз, и
дзенрезультат будет достигнут.-
3
-
-
..никто не будет поднимать фтп сервер.. ..высока вероятность .. угона учетки..
Есть тьма публичных фтп
помоекхранилищ и проблема кражи логопары, в данном случае, неактуальна.А так да, верно подмечено, и было бы хорошим тоном выводить дисклеймер в программе, типа "Ввод логопары небезопасен!!1111 Страх и риск, бла-бла-бла!111"
p.s. точечки рулят
-
...Потому написал я FTP клиент для OpenComputers...
Браво!
Еще бы telnet или ssh, и все барьеры сняты.
-
1
-
-
Я учусь на программиста.
Если на программиста, то ребутать через 5 секунд после вывода сообщения об ошибке - плохой тон.
Делай "пресс ани кей то ребут". Чтобы пользователь, при ошибке, успел осознать всю тщетность бытия.
-
1
-
-
Большое спасибо за то, что вы не удалили мою тему про оболочку Rome OS. Наверняка ее исходники используются для некоторых других программ. Долго не обновлял, потому что был занят учебой(я студент) и не хватало идей.
Короче, я планирую переделать с нуля свою оболочку для CC и OC, даже версию придумал Rome 1.0 Reloaded Edition или Rome-RE 1.0
Разработку начну завтра. Через пару недель может появиться версия 1.0-rc1
Заметьте, я выпускаю сначала для CC, а затем для OC.
Не на маркетолога случайно учишься?
Посмотрел код, lib/error улыбнуло.
-
1
-
-
e = require("event")
e.listen("Ы", function()
e.cancel( e.timer(io.read("*n"), function()
print("Варим пиво")
end, math.huge) )
end)
-
1
-
-
Есть еще каноничное goto )
Добавить немного if-ов, приправить then-ами и можно подавать.
А wile-ы с until-ами, так же как и for-ы, отлично сочетаются с break-ами.
Рецепты смотреть тут: http://www.lua.org/manual/5.2/manual.html#3.3.4и тут: http://www.lua.org/manual/5.2/manual.html#9
-
Ну так я и говорю: придется вручную делать некую программку, вешающую на _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, и т.п.) можно будет после первого вызова библиотечной функции. Да и первый вызов можно делать назначением.
-
А, вот ты о чем. Ну да, занятный способ, правда, довольно потно реализуемый: как именно привязывать заглушки к библиотекам? Вручную описывать все существующие функции в библиотеке 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 который будет финдфайл существующие библиотеки и вешать заглушки и/или из параметров ком.строки брать.
-
Прочитал и посты ниже, очень интересная идея, но с одним недостатком: имхо это не очень эффективно, ведь обращение к local-переменной осуществляется быстрее и было бы лучше создать такую переменную на стадии инициализации(как в моей среде), а не юзать поле таблицы _G
Давно так делал, через init.lua происходило добавление. Правда, в таких случаях в память может грузануться крайне прожорливая либа, которую ты в данном контексте даже использовать не собираешься (например, двойной буфер требует 200 кбайт оперативки), а это в некоторых ситуациях критично. В конце концов немного переосмыслил ситуацию и подгружаю библиотеки во все то же _G пространство через такой вот незамысловатый цикл:
Я говорил немного не о том.
Суть идеи не в том, что при старте ОС превентивно подгружать библиотеки, а в том, что для существующих библиотек в глобальном окружении создаются пустые индексы (заглушки) с маленькой мета-функцией.
В результате:
- При запуске ОС, в память не загружается ни одна лишняя библиотека. Затраты памяти только на двухстрочную функцию.
- При попытке вызова заглушки, например term.clear(), произойдет автоматический вызов require("term").
Т.е. загрузка нужной библиотеки будет происходить автоматически, при попытке доступа к ней.
-
Стоит надеятся, что в opencomputers _G работает так-же
_ENV вон не работает_G прекрасно работает... в смысле, что таблица с именем _G это глобальное окружение доступное для манипуляций. А с _ENV немного непонятки, поскольку _G==_ENV.
P.S.
Видится мне, что простейшим/лучшим вариантом функции для автоматической загрузки библиотек будет использование существующего кода. Т.е. метаметод _newindex в простейшем варианте будет делать require().
Если кто имеет возможность проверить такой финт, отпишитесь пожалуйста, работает ли. А то я уж все майнкрафты с луа поудалял давно.
-
Да. С _G можно взаимодействовать, как с обычной таблицей, на ней будут работать все свойства и методы метатаблицы.
Отлично!
Дело за малым. Накидать код который будет цеплять на _G метаметод подгрузки запрашиваемой библиотеки, и запихнуть его в автозагрузку. И с require() можно прощаться.
-
П.С. Чего ты прицепился) ...
Прицепился потому, что, по моему скромному мнению, столь авторитетное лицо не должно допускать высказываний типа, - Ваши действия не имеют смысла. - А наоборот, должен всячески поощрять любые дискуссии по теме проекта, в том числе дискуссии по построению велосипедов и прочих самокатов. (хотя бы потому, что это релевантный контент)
Даешь больше оригинальных велосипедов!
Вернемся к теме сред.
Можно ли на _G повесить метаметод __newindex, и обеспечить таким образом автоматическую загрузку библиотек?
-
Вот только эта теория скорее всего интересна и нужна будет дай Бог одному человеку из 1000 юзеров форума, а многих даже отпугнет от изучения программирования

Именно на этого одного мы и ориентируемся. Хотя...
Я думаю ты недооцениваешь процент любознательных людей. Лично я пришел на этот форум с вопросом: "Как получить доступ к локальному окружению из функции загружаемой через load()", и получил продуктивный диалог как минимум с двумя оппонентами.
В основной массе игроки жалуются, что табла почему-то не конкатенейтится со стрингом и орет ошибкой и спрашивают, как получить заряд МФСУ-шки через адаптер и как запихать в робота сундук с киркой=) Куча либ лежит прекрасных на форуме и никто их не юзает, а игроки упорно в программках своих пишут свои ванильные "файле.опен" и "файле.рид" с "файле.клоузе". =)
Изобретая велосипед ребенок учится изобретать и изучает устройство велосипеда.Что толку от теории, если практической пользы нет?
Да. Трактористу от цилов Карно нет никакой пользы. По крайней мере он в этом уверен.
-
П.С. В эмуляторе Луа в моде ОС вызов collectgarbage() отключен. Что там и как работает на детских комПуктерах и нужен ли нам весь этот огород и безумная возня в нашем конкретном случае для майна со сборщиками мусора, "средами разработки" и прочей дребеденью, один крипер знает. Скорее всего, это только снизит производительность и будет грузить сервер ненужными операциями.
Там все работает автоматически, сборщики мусора, "укладчики" и "сохраняльщики", нам нужно лишь следить за тем, чтобы не писать говно-проги и говно-циклы, локализировать переменные, следить за памятью свободной, так как у нас ее сотни килобайт какие-то, проверять фри-мемори на этапе разработки программы, использовать только необходимые библиотеки, исходить из здравого смысла и понимать, что таблицы длинной в 2^100 элементов в ОЗУ игрового комПуктера не поместить никак и нам не нужно писать новый ОпенВиндовс вместо копалки, как некоторые любят. Мод ОС НЕ рассчитан на гигантские проги и великие рекорды мира и Гиннеса, а также на космические проекты для расчета орбиты Вояджера-2, чтобы тут сидеть ночами и "ломать голову" над тем, как освободить лишние пару килобайт ОЗУ.
Окстись, неверный! Мы тут учимся программировать!
Не пытайся нас остановить, и ограничить копалками!
Мы будем писать свои ОпенВиндовсы, ставить великие рекорды Гиннеса, и рассчитывать траектории Вояджеров, ведь мы так учимся!
З.Ы.
Сборщики мусора оттого и появились, что погромисты заб
иывали как оно все работает внутри, и оставляли много мусора + пикча про лень, выше. А то, что мусорщик в моде отключен и, в данном конкретном случае, работать не будет - вовсе не мешает теоретическому исследованию проблемы в образовательных целях. Не так ли?-
2
-
-
В данном случае память особо не тратится, т. к. не библиотека второй раз не загружается с диска, а уже хранится в package.loaded, оттуда и берётся в при вызове require(), следовательно (c == component). То-есть память тратится только на переменную, но не на её значение.
Я использую другой метод, я заставляю сборщик мусора решать за меня, какая библиотека используется, а какая нет. Как известно сборщик мусора удаляет те объекты (таблицы, функции, потоки, userdata) в Lua, которые не используются ни в одной переменной, к которым нет доступа ни откуда. Значит мы можем использовать эту особенность у удалять неиспользуемую библиотеку с помощью метатаблиц:
setmetatable(package.loaded, { __mode = "v" })Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся.
Красивый способ.
Метатаблицы сильны.
Насколько я помню, есть метаметод вызываемый при обращении к несуществующему индексу. Теоретически, если повесить на _G такой метаметод, и попросить его искать и подгружать найденный модуль, то можно вообще избавиться от всяких там require() в программах.
Я не уверен, можно ли проделать такой фокус с _G. Если не получится, то думаю, что можно создавать заглушки для подгружаемых модулей с этим же метаметодом. Хотя это менее красиво, и требует дополнительных действий по предварительному поиску модулей, и созданию заглушек.
-
Если этим демонстрируется освобождение памяти от модуля "lol", то ничего не выйдет, модуль всё ещё хранится в таблице package.loaded.
Да, я кеп.Спасибо, хорошее замечание.
Глянул по диагонали код package.lua, насколько я понял, все что было когда-то require остается в памяти "навечно". Не взирая на то, что программа, для которой это require, уже отработала и выгружена. Поправьте меня если это не так...
Думаю, что package.loaded["lol"] = nil исправит ситуацию. Грубо, но вполне корректно.
Можно пойти дальше, и добавить в систему модуль (назовем его rampurge.lua) с коротким кодом:
local loaded = { ["_G"] = _G, ["bit32"] = bit32, ["coroutine"] = coroutine, ["math"] = math, ["os"] = os, ["package"] = package, ["string"] = string, ["table"] = table } package.loaded = loadedТеоретически, вызов require("rampurge") обнулит кеш package до состояния "после загрузки".
-
lol = require "lol"
бла-бла-бла
lol = nil
бла-бла-бла-
1
-

Функция #
в Разные (отсортировать)
Опубликовано: · Изменено пользователем swg2you
А так
Varname:len
Можно в 5.0?
Upd:
Я б всеже попробовал повесить на таблицу и строку метаметод. Какуйто унарную операцию которая не имеет смысла для этих типов.