@ProLua

Страница 47 из 307
Group Butler [beta]
05.02.2017
08:56:27
Добро пожаловать в чат pro.lua, Dmitry! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Tverd
05.02.2017
09:07:16
Типичный препроцесор, как moonscript, который грузит луа-модуль, выгребает списки макросов и подставляет их туда где стоят соответствующие метки, под конец - запуская модуль loadstring'ом. Довольно просто.
Это спасибо, мунскрипт юзаю. Даже написал moonclass для того что бы прозрачно пользовать мунскриптовые классы в чистом луа и наоборот. А вот что-то в момент исполнения типа loadstring. Хотя в теории и кложур думаю хватит

Group Butler [beta]
05.02.2017
10:46:50
Добро пожаловать в чат pro.lua, Denis! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Добро пожаловать в чат pro.lua, Alexandr! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Google
Mirocow
05.02.2017
17:38:28
всем привет

yegorf1
05.02.2017
17:38:31
Прив

Mirocow
05.02.2017
17:38:36
а есть такой канал по bash

yegorf1
05.02.2017
17:49:10
БашОргу или Башу?

Alex Фэils?︙
05.02.2017
17:59:45
Mirocow
05.02.2017
18:00:31
спасибо

bash

не bash.org

pro.linux - нет такого

yegorf1
05.02.2017
18:10:06
pro.linux Операционная система Linux. Взамен старой-доброй группы pro.linux с которой и началась вся серия групп pro.*, т.к. создатель её покинул нас и новые участники не могут добавиться. https://telegram.me/joinchat/Be4rsT7VI1LxrHaMR3pezQ #linux #unix #nix #tux #os #arch #fedora #ubuntu #gentoo

Mirocow
05.02.2017
18:20:57
спс

добавил

а где каталоги этих чатов

Google
0x9d8e
05.02.2017
18:29:18
Народ. Я тут третий раз написал один и тот-же код: for x, row in ipairs(map) do for y, cell in ipairs(row) do do_somethyng(x, y, cell) end end И естественно захотел вынести это в хелпер, чтобы юзать так: h.each2d(map, function(x, y, cell) { .... }) Но задался вопросом: а каков в луа оверхед на замыкания? Можно ли считать за никакой?

Tverd
05.02.2017
18:39:05
Лично на мой взгляд, можно пренебречь, если цикл большой... Но можно и протестировать

Создание функции конечно занимает время, но мало

Snusmumriken
05.02.2017
18:39:55
На замыкания - оверхед как будто функцию лишнюю объявили и вызвали.

0x9d8e
05.02.2017
18:47:26
Спасибо

В крайнем случае на этапе оптимизации на хардкод заменю

Mirocow
05.02.2017
19:15:18
https://github.com/radiotail/lua_memleak/blob/master/memleak.lua

Group Butler [beta]
06.02.2017
06:21:12
Добро пожаловать в чат pro.lua, Евгений! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Tverd
06.02.2017
06:58:06
https://github.com/tverd/moonclass это на всякий случай, если кому либо нужно

Snusmumriken
06.02.2017
07:04:57
Хех, штука забавная. На практике, правда, я всю дорогу использовал две вещи. 1. http://pastebin.com/K1yRyE1T 2. Class = {} Class.__index = Class setmetatable(Class, { __call = function(self, ...) local o = {} o.foo = {...} return setmetatable(o, {__index = self}) end, __index = parent_class }) function Class.bar() return self.foo end obj = Class(x, y, z) Причём второе - чаще, потому что в модуле чаще всего нужны один-два класса. Хм. На самом деле, я бы не отказался от препроцессора lua, который добавлял бы, например, стрелочные функции с макросами и прочей мелкой мелочёвкой. Опционально типизированные аргументы функций, например, чтобы ошибки возвращали и принимали целый список возможных типов ибо полиморфизм.

Tverd
06.02.2017
07:08:24
Второе тоже использую часто, если на чистом луа. Нормальный стандартный подход )

Snusmumriken
06.02.2017
07:10:03
Первое - просто моя либа. У меня где-то болтался сокращённый вариант без всяких хаков типа __gc для таблиц в lua5.1, который помещается в функцию из десятка строк. Лень подключать модули для ООП, поэтому в корень проекта просто копируется функция.

Tverd
06.02.2017
07:10:30
Насчет препроцессора тоже сижу думаю, тут либо самому писать, либо заюзать luamacro все таки. Второй путь проще, но не все можно сделать.

Snusmumriken
06.02.2017
07:10:47
Metalua - можно почти всё сделать.

Tverd
06.02.2017
07:11:51
Да, согласен. Ты использовал его для какого-нить проекта?

Snusmumriken
06.02.2017
07:12:48
Не а :) Не нужно. У меня задачи простые, расширять семантику особо не требуется. Примеры типичных моих задач - на том же пастбине, у того же пользователя. Там есть очень-очень хитрые хаки, но всё таки расширение семантики лишнее.

Tverd
06.02.2017
07:13:48
Окай, глянем. Кстати знаешь хак для gc в 5.1 луа?

А то я смотрю в объекте его нет

А нет, сорь ))) есть

Snusmumriken
06.02.2017
07:14:37


Google
Tverd
06.02.2017
07:15:09
Уже увидел, гуд

Snusmumriken
06.02.2017
07:16:36
Читы, читы. Ещё был вариант с множественным наследованием, перебиравшим ключи родителей, но мне стало страшно от скорости работы и чудовищности самой концепции. Плюс многие классы требуют вызова собственной инициализации, и одними методами тут не расширишь. И метаметоды не подцепишь.

Tverd
06.02.2017
07:18:02
Делал то же самое но для магических методов. А так обычные методы спокойно наследуются.

Но конечно только для одного

Тут наверно проще делать через mixin

Snusmumriken
06.02.2017
07:18:40
Где в lua есть mixin? Или ты про отдельную реализацию?

Tverd
06.02.2017
07:19:02
Отдельную, к сожалению этого нет в чистом луа

Snusmumriken
06.02.2017
07:19:49
Хех, кстати забавно то, что миксины, технически, делаются просто присваиванием одному классу методов другого. Это симпатишно, но отладка превращается во что-то страшное. На моей практике, быстрая отладка оказывается доминирующим фактором против множественного наследования и подобных расширений. Лучше уж наследоваться один раз.

Tverd
06.02.2017
07:21:28
Пока сильно не отлаживал ) а миксины делал максимум по 3 фукции в одной таблице, даже без инициализации пока, думаю что поэтоваться придется.

Snusmumriken
06.02.2017
07:22:49
Хм. Кстати, без наследования, миксины делаются экстремально просто. В моём "втором" варианте - вместо __index-ссылки на parent - ссылка на миксин как сет функций/констант, использующихся в разных классах. Ох уж эти __index'ы.

Tverd
06.02.2017
07:23:36
А есть поподробнее глянуть, на слух не пойму...

Кстати вот для этого миксины делал

Tverd
06.02.2017
07:23:59
http://www.codingcookies.com/2013/04/01/building-a-roguelike-in-javascript-part-1/

Snusmumriken
06.02.2017
07:29:20
mixin = {} function mixin:foo() print(self.x, self.y) end ClassFoo = {} ClassFoo.__index = Class setmetatable(Class, { __call = function(self, x, y) return setmetatable({x = x, y = y}, {__index = self}) end, __index = mixin }) function ClassFoo.bar() return self.x - self.y end ClassBar = {} ClassBar.__index = Class setmetatable(Class, { __call = function(self, x, y, w, h) return setmetatable({x = x, y = y, w = w, h = h}, {__index = self}) end, __index = mixin }) function ClassBar.bar() return self.x + self.y + self.w + self.h end obj1 = ClassFoo(x, y, z) obj1:bar() --> self.x - self.y -- из класса obj2 = ClassBar(x, y, z) -- из класса obj2:bar() --> self.x + self.y + self.w + self.h obj1:foo() --> print(self.x, self.y) -- из миксина obj2:foo() --> print(self.x, self.y) -- тоже из миксина

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

Tverd
06.02.2017
07:32:20
я с компа, уже скопировал. Я так понимаю что один миксин в двух классах. А если несколько миксинов? Или я опять чего-то не доглядел...

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

Snusmumriken
06.02.2017
07:35:42
Несколько миксинов - сложнее. Или у каждого миксина в __index ссылка на следующий, тогда объект будет наследовать кусок цепочки миксинов. Ну там, mixinA -> mixinB -> mixinC. Класс с mixinA получит и A и B и C, а класс с mixinB - получит B и C. То есть, тут только цепочка. Или, как вариант, в __index сидит функция, которая выбирает миксин из списка, если не находит ключа в одном. Как ты понимаешь, порядком обхода функции задаётся приоритеты миксинов, на случай одинаковых ключей. Множественное наследование делается аналогично.

Пример: __index = function(obj, key) for i, v in ipairs(self.parents) do if v[key] then return v[key] end end end

Google
Tverd
06.02.2017
07:37:42
Ну да, в общем так и делал... Брал миксин на этапе создания объекта вставлял из него методы и переменные в нужный класс... Твой вариант более медленный, понятно что постоянный прогон при поиске будет не фонтан.

Snusmumriken
06.02.2017
07:38:25
Для объектов с часто вызывающимися методами не приоритетных родителей - не фонтан.

Tverd
06.02.2017
07:38:40
Вот, в фабрике делал проще - на этапе описания объекта уже вставлял миксин )))) это было очень быстро.

Snusmumriken
06.02.2017
07:39:26
Но объекты создаются медленнее. Впрочем, для всяких синглтонов это не так важно.

Tverd
06.02.2017
07:40:01
Ну да, если мы не создаем, не убиваем по 100к объектов в секунду )

Snusmumriken
06.02.2017
07:41:54
В играх, довольно часто создаются и убиваются 100к объектов в секунду :3 Особенно если это пули, и у тебя есть механика синергии эффектов на пулях. Ну там, подобрал один предмет - пули изменили тип на взрывающиеся ракеты, подобрал другой - и взрывающиеся ракеты ещё и стали лететь по синусоиде.

Alexander
06.02.2017
07:42:02
В какой-то момент прочёл "токсин"

Snusmumriken
06.02.2017
07:42:26
Да, токсин убивающий возможность сопровождения :3

Admin
ERROR: S client not available

Snusmumriken
06.02.2017
07:43:27
Можно пул. Я вообще избалован FFI а луях, и использую его где ни попадя. Считай что сишка в луа. Кусок магии с компиляцией C-кода и возможностью цепляния ООП к сишным структурам.

Tverd
06.02.2017
07:44:00
В общем частная фабрика хранит уже готовый класс, с вставленными методами из миксина...

Это да, в короне этого сильно не хватает

Snusmumriken
06.02.2017
07:44:59
Это ещё и даёт +200 к скорости, особенно математики и длинных циклов без сложных ветвлений. Имхо, лучше таки два раза переписать, но шоб понятно было (+копипастить в любой другой модуль), чем миксины пихать. Стрёмное дело.

Tverd
06.02.2017
07:46:28
Ну стараюсь использовать больше компонентное программирование, чем наследование с 10 родителями. Я-то вспомню что там и как, а если другому человеку давать и править базовые классы, то можно все сломать.

Кстати я так понимаю ты с love2d дружишь. С рекламными сетями там как? Ручками прикручивать?

Snusmumriken
06.02.2017
07:49:46
Угу))) На андроиде можно извращаться: накатать на сишке либу которая грузит и высвечивает рекламу поверх экрана, с трансляцией в luaState набора методов, или FFI-биндинг стандартных ведро-либ для тех же целей. Хотя можно и совсем ручками: лишнее игровое состояние "показ рекламы", который грузит вебгетом или чем-то ещё ролик/картинку из сети, конвертит в читаемый для love2d вариант и рисует на экранчике с таймером и кнопкой "закрыть".

Tverd
06.02.2017
07:50:56
Эх... ) Тогда почему не кокос? Или реклама не сильно пока нужна?

Snusmumriken
06.02.2017
07:51:10
Потому что кокос - движок, а love2d - фреймворк. И есть JIT с огромной кучей плюх. Сахарную луа со скоростью сишки я ни на что не променяю, простите.

Tverd
06.02.2017
07:52:22
Ну тут ты кокос не удивишь джитом. А вот что фреймворк, да... Хотя по мне так кокос тоже не шибко прям движок. До юнити в плане удобства не дотягивает

Google
Tverd
06.02.2017
07:53:23
Даже урхо3д уже с джитом идет

Только корона без оного.

Snusmumriken
06.02.2017
07:54:03
Движок - среда для наполнения контентом. Всякие менеджеры сущностей с анимациями/коллизиями/игровыми состояниями и прочей лабудой. В ловке этого нема, но тут есть полная свободка действий. Я - тот самый извращенец который делает на ловке микросервисы, тулзы и прочую нагруженную фигню. Далеко не только игры.

Tverd
06.02.2017
07:54:32
Даже так? там графика не обязательна?

Snusmumriken
06.02.2017
07:55:21
Где-то графика не нужна, а где-то требуется. Ну там, микросервис который не только отвечает на запросы мониторинга, но и рисует графички загруженности. Что-то такое. Звук и физон тут не нужен, конечно.

Tverd
06.02.2017
07:56:09
Ну я имею ввиду, что можно ли юзать love2d в консоли... Если там есть таймеры, сеть и все это можно запустить без графики, то очень прикольно

Snusmumriken
06.02.2017
07:56:46
Конечно можно использовать в консоли. В конфигурационном файле отрубаешь окно и графику, получая чисто консольную ловку. Даже консольный музыкальный проигрыватель можно сделать. И клиент ВК, рисующий фотачки друганов в ASCII и с музычкой ))) Но это для особых мсье.

Tverd
06.02.2017
07:57:05
Заинтриговал )))) Посмотрю внимально на эту штуку.

Snusmumriken
06.02.2017
08:00:25
#conf.lua function love.conf(t) t.window = false t.graphics = false t.console = true end Прекол ещё в том, что ловка работает проигрывателем для кода. Имея дистр, можно легко и непринуждённо открывать им разные .love-файлы, которые суть zip-архивы с кодом и ресурсами типа картинок.

Tverd
06.02.2017
08:02:05
это да, я видел. Исходники марио ковырял.

Snusmumriken
06.02.2017
08:03:03
Ну, двиглы типа кокоса добавляют слишком много лишнего, жрут дофига места, памяти (в т.ч. оперативной, из-за неотключаемых штук) и ваще не выполняют суть linux-way: одна маленькая программа, которая делает только одну задачу, но делает это очень хорошо. Ещё веселее: отключаем и окно и консоль. Получаем аналог сервиса, который, правда, виден в диспетчере задач, но это и к лучшему.

Tverd
06.02.2017
08:06:16
Насчет движков тут понятно. Для этого он и движок, что бы все делать )

Snusmumriken
06.02.2017
08:06:41
Слишком вумный для меня. Предпочту работать с либами и иметь полный контроль над происходящим.

Tverd
06.02.2017
08:07:48
Не знаешь как его компилять? cmake . - ругается

Snusmumriken
06.02.2017
08:08:07
Visual studio. Я ещё mingw компилил.

Tverd
06.02.2017
08:08:20
под линух ) точнее под фряху

Snusmumriken
06.02.2017
08:08:38
Смотри чем он ругается :3

Плюшка
06.02.2017
08:08:40
Хочу написать графический движок на crystal, прикрутить ode и интерпретатор lua

Рейт замысел

Snusmumriken
06.02.2017
08:08:56
Для чего? : )

Страница 47 из 307