Попытаемся вместо "деревьев решений" в качестве альтернативы применить "наколенные таблицы решений" или "схематические таблицы" (по ссылке ранее), но по-драконовски, а точнее в контексте всё того же условного ДАЛВЯЗ.
Воспользуемся отмеченным выше примером функции "Tree_itemClick":
https://forum.drakon.su/viewtopic.php?f=228&t=6666#p103696Пусть текстовый (и графический) язык не позволяет goto (особая гибкость -- пусть для особых случаев, о чём далее). Построим код с применением "сопоставления с образцом" ("pattern matching") в виде оператора "CASE":
Код:
PROC Tree_itemClick(machine, item, event)
VAR now;
BEGIN
IF event.button === 0 THEN
now = getUnixTime();
CASE
item.lastClick,
(now - item.lastClick > DoubleClickThreshold),
(machine.state === "expanding")
OF
| TRUE, TRUE, TRUE
| FALSE, _, TRUE: SKIP
| TRUE, TRUE, FALSE
| FALSE, _, FALSE:
item.lastClick = now;
IF event.ctrlKey THEN
Tree_ctrlClick(machine, item)
ELSE
IF item.leaf THEN
Tree_singleClick(machine, item, event)
ELSE
Tree_clearSelection(machine);
Tree_selectItem(machine, item);
Tree_toggleExpand(machine, item, event);
END
END
| TRUE, FALSE, TRUE:
machine.postponedDClick = item.id
| TRUE, FALSE, FALSE:
Tree_doubleClick(machine, item, event)
END
END
END;
Сопоставлять можно как угодно:
Код:
CASE cond OF TRUE...
CASE TRUE OF cond...
CASE FALSE OF cond...
В общем, традиционный pattern matching -- любые предусмотренные семантикой образцы, с константами, переменными, символами игнорирования, с деструктивным разбором структуры-образца на элементы и т.д.
Как, напр., и в функциональных языках предполагаем, что оператор "IF" есть всего лишь частный случай оператора "CASE":
Код:
CASE cond OF
| TRUE: ...
| FALSE: ...
END
Графическая попытка:
Вложение:
20191025132014.png [ 36.61 КБ | Просмотров: 13133 ]
Для любого "сопоставления" используется один оператор ("вопрос"). В полной форме осуществляется сопоставление образца с "операндами" -- якобы закруглённые прямоугольники -- по мотивам граф/штрих-схем (ранее в теме) и "схематических таблиц":
https://forum.drakon.su/viewtopic.php?f=228&t=6666#p103717В простой форме сопоставления -- как оператор "if" -- подразумевается неявный операнд "TRUE", всегда справа. Снизу -- всегда FALSE, где линия имеет разрыв или ее нет (при соединении с последующими иконами).
На схеме на маршруте под "CASE"-условиями мог бы быть вариант "иначе" (если бы был определен), с соответствующим операндом снизу условий (см. пример далее).