[19:07:36] <vlad2> /me впилился по-настоящему в циклические зависимости между модулями
[19:08:50] <vlad2> может таки рекурсивный импорт это не так плохо?
[19:12:07] <kpmy> и в каком порядке потом выполнять секции BEGIN у этих модулей?
[19:21:26] <vlad2> Да, про секции BEGIN понятно. Но вот если в модуле нет BEGIN?
[19:22:01] <vlad2> А так приходится искуственно пилить - ваыносить честь типов по отдельным модулям.
[19:24:36] <vlad2> Причем проблема пришла внезапно и жестко. Понадобилось добавить к рекорду метод, который возвращает нужную штуку для использоваиня в одном из мест. И все.
[19:25:28] <vlad2> Куча модулей, которые используют этот тип с новым методом стали циклическими.
[19:26:58] <vlad2> Самое простое, конечно, это кастать в конкретном месте.
[19:27:14] <kpmy> ошибка проектирования
[19:27:21] <vlad2> Но очень не хочется в динамику уходить только из-за такой вот проблемы.
[19:27:46] <vlad2> Да, наверное ошибка. Вопрос как ее быстро исправить.
[19:29:51] <vlad2> Кстати, Вирт про рекурсивный импорт ничего не пишет :) Несколько я помню.
[19:45:05] <kpmy> ну вирт ничего не говорит даже про необходимость того, чтобы все модули из списка импорта уже были доступны, когда загружаешь очередной модуль.
[19:47:06] <kpmy> а вот в репорте КП есть указание
> The statement sequence following the symbol BEGIN is executed when the module is added to a system (loaded), which is done after the imported modules have been loaded. It follows that cyclic import of modules is illegal.
[19:49:28] <kpmy> наверное для статической загрузки всех модулей из бинарника такое уточнение нахуй не нужно, все и так понятно. А учитывая то, что система может использовать процедуры как команды недостаточно только отсуствия секции BEGIN.
[19:57:48] <vlad2> Со статической загрузкой при наличии BEGIN те же проблемы - непонятно кто кого и когда (во что и вляпываешься иногда в мире С++)
[19:58:23] <vlad2> А вот почему рекурсивность должна мешать в случае команд и в случае отсутствия BEGIN - не понялю.
[20:00:51] <vlad2> Вот что тут такого криминального:
MODULE M1; IMPORT M2; TYPE T1 = RECORD t2: POINTER TO M2.T2 END; END M1.
MODULE M2; IMPORT M1; TYPE T2 = RECORD t1: POINTER TO M1.T1 END; END M2.
[20:03:44] <vlad2> При том, что в рамках одного модуля точно такой же конструкт в описании типов вполне допустим:
TYPE T1 = RECORD t2: POINTER TO T2 END;
T2 = RECORD t1: POINTER TO T1 END;
[20:04:47] <kpmy> система может вызвать любую команду в произвольный момент
[20:05:53] <kpmy> а зависимость от модуля еще не решена
[20:05:58] <vlad2> Да, но в данном случае даже кода как такового не будет 0 только информация о типах.
[20:06:58] <vlad2> Ладно, я там разрулю свою проблему с зависимотями и потом еще напишу.
[20:07:41] <vlad2> Пока главная претензия - что оно вылазит неожиданно и быстро не лечится.
[20:08:17] <kpmy> ну система проверит доступность процедуры данного модуля и вызовет. а процедура дергает непрогруженные (в т.ч. циклические) модули.
[20:09:30] <kpmy> > тут такого криминального
с нуля не откомпилируешь, все время нужен внешний тип :)
[20:39:06] <kpmy> по опыту - если возникают кластеры A.b и B.a то значит надо делать C.a и C.b чтобы они общались через ownerа
[20:46:55] <vlad2> Что ты имеешь ввиду под "общались"?
[20:47:34] <vlad2> Ну а вообще да - треться сущность всегда разруливает первые две.
[21:07:37] <kpmy> ну это типа агрегат, если есть отображение которое обновляется по таймеру, и контроллер для ручной остановки, то я не делаю ссылку на таймер прямо из контроллера, и не делаю в таймере ссылку на флаг продолжения в контроллере
я из контроллера передаю запрос отображению "стой" и оно может само остановить таймер, а может передать этот сигнал таймеру напрямую, при этом контроллер не знает про таймер вообще ничего, только про отображение.
[21:11:14] <kpmy> имея подконтрольный компилер можно пилить запилить например особый абстрактный рекорд, который расширяешь, и при размещении в памяти система оповещает экземпляр рекорда об объекте, в котором он лежит и других таких же рекордах в этом же объекте.
[21:13:06] <vlad2> Понятно. А зачем такое понадобилось?
[21:16:29] <kpmy> один из вариантов множественного наследования в языке без множественного наследования.
[21:18:32] <kpmy> без наворотов языка, чисто за счет фич рантайма.
[21:19:00] <kpmy> http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%81%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
[21:24:06] <kpmy> можно и без фич рантайма, но получается ненадежно, вручную инициализировать
[21:57:28] <kpmy> но, возможность эмулировать такую штуку дает переносимость, ведь используются только средства языка.
в этом профит, вместо обобщенного типа элемента списка добавляешь деталь "сравнимое с" и деталь делает все что нужно.
[22:40:37] <vlad2> Из того описания не очень понятно. Речь идет о примесях в ББ, так? Как то выглядит в использовании?
[22:40:52] <vlad2> *это
[22:46:20] <kpmy> ну типа, смотри, в ББ есть тип View, и наследники от него. MyView например.
И внезапно мне захотелось, чтобы эта v: MyView получала сигналы от таймера.
В ББ есть Action, но я не могу сделать MyView наследником Action.
Я могу сделать отдельный MyAction.
И сделать перекрестные ссылки a.v и v.a.
Это простой путь.
А можно сделать где-то там библиотечный тип Task = ABSTRACT RECORD у него будет абстрактный метод Tick.
Потом я сделаю наследник MyTask, и реализую метод Tick, внутри будет работа с MyView. просто размещу экземпляр MyTask в v.
получится
MyView = POINTER TO RECORD (Views.View)
t: Task;
END;
и когда я сделаю NEW(v), то рантайм должен проинициализировать
[22:46:54] <kpmy> Чтобы это заработало, в идеал рантайм сам проинитит конкретный объект t моим агрегатом v, то есть t будет точно знать, что он работает с v
[22:47:28] <kpmy> Ну в реальности все немного сложнее, потому что я не лез в рантайм, и надо отдельным действием сделать t.Init(v)
[22:48:32] <vlad2> А. Теперь понял.
[22:48:39] <kpmy> но потом начинается профит - где-то тикает таймер, он смотрит на параметры агрегата v и дергает конкретную деталь t в конкретный момент, то есть связь устанавливается объект-объект
[22:48:54] <kpmy> при создании объекта агрегата
[22:49:59] <kpmy> в обероне наверное можно так же сделать
[22:50:02] <kpmy> даже легче
[22:50:23] <vlad2> А как же любимая message bus? Здесь ведь достаточнео, чтобы таймер не лергал метод, а посылал сообщение. Тогда MyView может непосредственно отбрабатывать как Action.
[22:50:26] <kpmy> ведь ссылку на процедуру-метод v можно сразу передать в t
[22:51:26] <kpmy> а у меня есть деталь и для шины, просто деталь таймера имеет конкретный тип, чуть меньше динамики, чем в произвольных сообщениях.
[22:52:47] <kpmy> профит деталей - тебе не нужно хранить список объектов, в которые хочешь разослать сообщение - механизм деталей сам находит объекты
[22:53:15] <vlad2> Понятно.
[22:53:25] <vlad2> Так а ты пробовал это реализовать?
[22:53:55] <kpmy> да, где-то была тема на форуме
[22:54:38] <vlad2> Это во это: http://forum.oberoncore.ru/viewtopic.php?p=86070#p86070
[22:54:40] <vlad2> ?
[22:55:16] <kpmy> не, это новая итерация желания всем дать по хэндлеру)
[22:56:23] <vlad2> В смысле там тоже инсинуации с виртуальными методами
[22:58:01] <kpmy> ну я делал без всяких фич, тупо через рефлексию - передаешь любой объект с примесями в сервисный модуль, а он по очереди инициализирует все детали объекта.
[22:58:33] <vlad2> И чем такое не устраивает? Медленно?
[22:58:55] <vlad2> Лишний вызов?
[22:58:56] <kpmy> вот тема http://forum.oberoncore.ru/viewtopic.php?f=47&t=4175&hilit=+%D0%B4%D0%B5%D1%82%D0%B0%D0%BB%D0%B8 а про реализацию я там даже не написал, видимо забыл
[23:00:50] <kpmy> ну оно не медленно, ведь рефлексия используется только один раз, при инициализации, а потом просто указатели и методы.
я юзаю, когда нужно, но в целом, имея доступ к рантайму, можно сделать и без сервиса.
[23:27:29] <vаlexey> http://www.opennet.ru/opennews/art.shtml?num=39129
[23:27:32] <vаlexey> а оберона нету...
[23:28:01] <vаlexey> блин, даже модулы нет!
[23:28:25] <kpmy> https://github.com/leachim6/hello-world/blob/master/o/oberon.o
[23:28:43] <kpmy> модула там же
[23:29:20] <vаlexey> да, там более полный репозиторий хелловорлдов
[23:38:35] <vlad2> О! vаlexey проявился ;)