Арка: Взаимодействие инструментов (Вир)

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

Сначала о том, какие способы взаимодействия использовались в Вире. Следующим шагом можно будет подумать, а какие взаимодействия нужны сейчас.

Я буду использовать термин «инструмент», если речь идет о компоненте в Вире. Начну с устройства, очень кратко:

  • Каждый инструмент стоит на верстаке, верстаки связаны в дерево.
  • У каждого верстака в схеме есть имя.
  • У каждого инструмента тоже есть имя, но это имена разной природы.
  • Имя инструмента дается разработчиком инструмента, например, «Сравнить списки имен», это имя отражающее его назначение.
  • Имя верстака дается сборщиком, и оно отражает назначение под-дерева в схеме, например, «Текстовый редактор» — это верстак, на котором стоит множество инструментов.
  • Инструмент реализует набор «команд» (аналог: экспортированных методов). Обращение к команде идет по имени. Отмечу — по строке, задающей имя!
  • Так как никакого «типа» (класса) у инструмента не существует, то сделать обычную для ООП виртуальную таблицу нельзя. Таблица команд в инструменте есть, но выбор команды в таблице делается бинарным поиском по имени. Для ускорения поиск ведется не по строке имени, а по хешу, но это оптимизация, не влияющая на суть.

Если в коде есть указатель на инструмент, то к команде можно обратится (в условном синтаксисе): инструмент.`имя команды`(аргументы). Если у инструмента есть команда, она вызывается, если нет, действие игнорируется. В этом смысле, Вир близок к SmallTalk — если у объекта не задана реакция на сообщение, то отправка сообщения игнорируется. Назову этот способ: прямой вызов команды инструмента.

Сигнатура команды в Вире не проверяется  (вообще), то есть если передать неверные параметры, то поведение не определено. И это даже не Javascript, а вообще отсутствие проверки — как статической, так и динамической. Несколько смягчает ситуацию то, что параметры любой команды, это последовательность слов int64, вместе с которой передается длина. Так что команда может проверить количество аргументов.

Так как верстак — это инструмент, то точно так же можно обратится к верстаку, и очень часто в коде это происходит, например: пусть и = верстак.`Найти инструмент по имени`(`Сравнить списки имен`). Результатом будет инструмент (указатель на инструмент) или 0. И дальше можно и.`Сравнить списки имен`(список1, список2).

Но если обратиться к верстаку с именем, а такой команды у верстака нет, то будет выполнен поиск инструмента на верстаке с таким именем, и если инструмент нашелся, то будет вызвана «основная» команда инструмента.

То есть вызов верстак.`Сравнить списки имен`(список1, список2) приведет к вызову команды «Сравнить списки имен» у инструмента с именем «Сравнить списки имен». Это косвенный вызов основной команды инструмента через верстак.

Вызов основной команды также используется для инструмента, подключенного к кнопке UI интерфейса. Щелчок по кнопке приводит к такому коду: пусть и = верстак.`Дай команду`(номер-последней-команды); путь имя = и.имя; и.имя(). Словами: берется последний из инструментов стоящих на верстаке (а кнопка — это верстак), и у этого инструмента вызывается команда с именем равным имени инструмента. Это прямой вызов основной команды инструмента.

Таким же образом можно последовательно перебирать все инструменты, стоящие на верстаке. Например, делать опрос — вызывать инструменты последовательно, пока один из них не ответит, что действие выполнено (результат не равен 0). На Тривиле это бы выглядело примерно так:

цикл инс среди верстак.инструменты { надо инс.имя() = 0 иначе прервать }

Вот эти уже перечисленные способы — это то, с чего начинался Вир. Что здесь важно, для вызова нужен или инструмент или верстак (указатели на них).

В любом случае, сначала надо найти верстак (а потом инструмент, если он нужен). Для поиска верстака у каждого инструмента есть свой набор «настроек», множество пар (имя, значение). В настройки при сборке схемы записывается имя того верстака, с которым инструмент будет взаимодействовать. Например: Имя верстака=..\Редактируемая программа. Инструмент найдет этот верстак (настройка задает: перейди уровнем выше, и там найди верстак с именем «Редактируемая программа»), и дальше будет работать с инструментами на этом верстаке прямыми или косвенными вызовами.

Естественно, нужна проверка того, что верстак есть и т.д. И есть два подхода — искать верстак каждый раз или найти один раз и запомнить. Первый случай защищает от ошибки в случае удаления найденного верстака. Второй способ быстрее. Тут сразу на ум приходят счетчики использования, слабые и сильные ссылки, и т.п. В Вире ничего такого не было.

Замечу, что строка поиска верстака в Вире весьма хитрая, с дополнительными возможностями, но я не рассматриваю их здесь, так как к взаимодействию это прямого отношения не имеет.

Напомню, что все выше перечисленные способы взаимодействия использовали указатели на верстак или инструмент. Но есть и другие способы.

 

 

 

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *