ibnteo писал(а):
ещё и функциональное программирование удастся на схемы перенести
Да, фактически, вообще вряд ли обойтись без функциональщины, если попытаться выстроить модели с возможностью аналитики человеком. Имеется ввиду, что в императиве как модели "поток управления" сложно обойтись без помощи "управления от данных". Но точечно, глобальные так называемые "thunk"-и -- вычисления по требованию -- создают недетерминизм со своими проблемами.
Рисовать "да/нет"-сети в Р-схемах хуже, чем в Дракон-диаграммах (возня с пустыми переходами). Р-схемы принуждают действовать "по-автоматному", по возможности оперируя конъюнктами событий. Чтобы схемы были "один в один" с текстом, нужен и соответствующий текстовый язык (mainstream-языки не для этого).
Рассмотрим иной вариант примера выше. Пусть текстовый формализм будет Pascal-подобным. Оператор "with" пусть будет как в Modula, но с расширенной семантикой -- вычисления по требованию (к сожалению, оператор "with" вместе с Modula развития не получили, Си-производный mainstream задушил альтернативы). Оператор "with" вводит локальные переменные как ссылки (на объекты (или как value-значения в случае вычислительных выражений), как текущее состояние, мол уже свершившееся факты). Однако предполагается, что вычисление переменных осуществляется один раз и тогда, когда нужно по требованию. В некотором роде -- аналог операторов "let" или "where" в "настоящих" функциональных языках программирования. Транслятор (а не человек) заниматься анализом зависимостей и построением нужных goto или inline-вычислений, формированием thunk-функций если нужно, и когда нужно - после срабатывания необходимого "защитного" выражения (условий), если таковы возникают в любом возможном месте в теле оператора "with".
Также не помешала бы такая же семантика и для переменных, объявляемых перед телом процедуры (до начального begin), если имеются инициализирующие значения.
Продублирую здесь постановку задачки -- она, фактически, как раз и была выстроена интуитивно почти "по-автоматному":
https://forum.drakon.su/viewtopic.php?f=228&t=6666#p103696Степан Митькин писал(а):
Есть такой виджет - TreeView.
Это сложный виджет с хитрым поведением. Рассмотрим алгоритм реакции виджета на щелчок мыши по элементу дерева.
- Нам интересны щелчки только левой кнопкой мыши.
- Если не так давно уже был щелчок, то это двойной щелчок.
- Если виджет находится в процессе раскрытия узлов, мы игнорируем одинарный щелчок, но обработку двойного щелчка
откладываем на потом.
- Особо обрабатываются щелчки с нажатой клавишей Ctrl.
- Для узлов, которые могут иметь дочерние узлы, мы
1. выделяем узел,
2. начинаем процесс раскрытия узла (это дело долгое).
Код и схема:
Код:
PROCEDURE Tree_itemClick(machine, item, event)
BEGIN
IF event.button = 0 THEN
SKIP
ELIF WITH
now := getUnixTime();
doubleClick := item.lastClick & ((now - item.lastClick) <= DoubleClickThreshold);
expanding := (machine.state = "expanding");
IF doubleClick & expanding
DO
machine.postponedDClick := item.id
ELIF doubleClick DO
Tree_doubleClick(machine, item, event)
ELIF expanding DO
SKIP
ELIF
item.lastClick := now;
IF event.ctrlKey THEN
Tree_ctrlClick(machine, item)
ELIF item.leaf THEN
Tree_singleClick(machine, item, event)
ELSE
Tree_clearSelection(machine);
Tree_selectItem(machine, item);
Tree_toggleExpand(machine, item, event);
END
END END
END
Вложение:
tree_item_click.png [ 23.24 КБ | Просмотров: 5246 ]
Форма оператора "with" как:
with...if...do...elif...else...end
есть сокращение (совмещение) от:
with...do if...then...elif...else...end end
На схеме оператор "with" отмечен дугой без стрелки с "разорванной" вершиной без предиката -- "поглощающий" блок, не сам переход. Условия в стартовом "if" заданы как альтернативы конъюнктов событий на манер "join calculus" (упорядоченные варианты, сначала максимальный охват, затем сужение, альтернативы). Этот паттерн должен быть разрулен автоматически оптимизировано, так же как "boolean shortcut evaluation". При потребности транслятор должен выдать итоговый автомат (с "редукцией" with-переменных), если нужно для рассмотрения. Или таблицу решений, с наборами правил и разметкой "T/F", блок/Дракон/Р-схему можно слепить в итоге.
Возможен оператор цикла вида "while with ... do..." с таким же набором переменных, их вычисление в этом случае осуществляется на каждой итерации. На схеме цикл задаётся под двойной дугой.
Схемы, фактически, изымают из потенциального текстового языка "шашечки" (ключевые управляющие слова) и показывают направление, как и куда ехать будем.
Альтернативно "редукцию" переменных на схеме можно показать как-то иначе, нечто вроде "FBD". Но формулы "разрывать" как-то не очень..., "схематические таблицы" демонстрируют такой эффект (некие вспомогательные линии передачи операндов между формулами возможны):
https://habr.com/ru/post/80893/