DRAKON.SU

Текущее время: Вторник, 19 Март, 2024 05:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 18:32 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
Как может быть осуществлена дозированная инъекция управления "от данных" в Р-схемах.

Задействуем оператор вида "with...do...end" из Pascal, точнее Modula -- создание временных переменных, "живущих" до конца блока. Однако вводим его интерпретацию как аналог "let...in..." ("пусть ...") в математических текстах или ряда функциональных ЯП (или как постформа "... where ..." или "..., где ..."). Переменные "вычисляются" только один раз и лишь в случаях реального их применения -- вычисления по требованию, в т.ч. и со стороны смежных формул. Востребованность первично возникает в точках входа "do" (и "else") блока "do...end" (в зависимости от входных "защитных" условий и прочего содержимого блока -- см. далее):
Код:
p1();
with
  a = f1(...);
  b = f2(a);
  c = f3(...);
do
  p2(a, b, c);
end;
p3();

Вложение:
r14.png
r14.png [ 4.41 КБ | Просмотров: 4331 ]

На схеме блок задан под дугой с "разрывом".
Переменные задаются как набор формул, в т.ч. взаимоиспользуемых, редукцией занимается транслятор/читатель.
В примере выше вводятся три переменные и все используются процедурой p2.

Блок может быть дополнен "защитным" выражением -- do-часть исполняется при успешном предикате, заданном через if (перед ключ. словом do):
Код:
p1();
with
  a = f1(...);
  b = f2(...);
  c = f3(...), if a > b;
    = f4(...), if a = b;
    = f5(...), otherwise;
if a & b & c do
  p2();
  p3();
end;
p4();

Вложение:
r15.png
r15.png [ 6.74 КБ | Просмотров: 4331 ]

Выше формула для "с" содержит "если/иначе". Такой стиль (как математические уравнения) удобнее, чем вложенные тернарные условные операторы (вида "x = if ... then ... else ... ", "x = (case ... of ...|...)" или си-шный "?:").

Может быть множество "охран":
Код:
p1();
with
  a = f1(...);
  b = f2(...);
  c = f3(...), if a > b;
    = f4(...), if a = b;
    = f5(...), otherwise;
if a & b & c do
    p2();
    p3();
elif a & b do
    p4();
else
  p5();
end;
p6();

Вложение:
r16.png
r16.png [ 9.31 КБ | Просмотров: 4331 ]

Основная задача -- сохранить целевую особенность схемы: упорядоченность предметных действий. Так выше "график работ" выражает последовательность: после p1 следуют p2,p3 или p4 или p5. Важно "вложиться" в единое выражение для предиката (если начнётся "лес" дуг для "раскрытия логики" -- это уже не "график работ", при потребности "лес" лучше выделять отдельной схемой/структурой).

Можно сопоставить формы представления примера ранее из темы "про деревья решений":
https://forum.drakon.su/viewtopic.php?f=215&t=6666&p=103698#p103696
https://forum.drakon.su/viewtopic.php?f=228&t=6666&start=60#p103984

Изображение
Изображение

Выше на Р-схеме (для оператора with там применялась двойная дуга с разрывом, но лучше "петли" использовать для циклических структур), например, "формула":

expanding := machine.state === "expanding"

, с потенциально "тяжёлыми" действиями, может оказаться невостребованной и невычисленной (соответственно и "тяжелые" действия могут быть не исполнены), если сработает первый предикат в операторе with.
(предикаты составлены на манер т.н. "join calculus" -- конъюнкты событий -- в примерчике выше: сначала указано условие "a & b & c" как вариант с максимальным охватом событий, далее предикаты предполагают сужение вариантов и альтернативы ("a & b"), с потенциалом для оптимизаций -- это уже проблемы транслятора).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 18:37 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
Когда "редукцией" заниматься тяжело, может помочь "комплементарный FBD". По сути FBD есть функция (комплексная в общем случае), соответственно возможна роль в качестве нагрузки дуг -- для любого вида применения, также, как и текстовые обозначения.
Например, изобразим аналог FBD-блока на рисунке ранее:
Код:
...
  X := ~B or (~C & ~D) or (E & F & G) or ~K;
  if X then
    print('X')
  else
    print('~X')
  end;
...

Вложение:
r17.png
r17.png [ 5.28 КБ | Просмотров: 4330 ]

Выше "FBD" используется как действие, результатом которого есть X.
Кружочком отмечено отрицание. Исполнение сверху вниз, слева направо (как и в самих Р-схемах), с учётом наличия на входе необходимых и достаточных операндов.

Воспользуемся "FBD" в качестве предиката над дугой, в данном случае для оператора with (с вводом новых переменных, с "анонимным" выходом у "FBD"):
Код:
...
with
  B = calc1(...);
  C = calc2(...);
  D = calc3(...);
  ...
if ~B or (~C & ~D) or (E & F & G) or ~K do
  print('X')
else
  print('~X')
end;
...

Вложение:
r18.png
r18.png [ 6.12 КБ | Просмотров: 4330 ]

Используем "FBD" как "формулы" для дефиниции переменных оператора with:
Код:
...
with
  X1 = (~C & ~D);
  X2 = (E & F & G);
if X1 do print('X1')
elif X2 do print('X2')
else print('~X')
end;
...

Вложение:
r19.png
r19.png [ 8.63 КБ | Просмотров: 4330 ]

Выше, например, вычисление X2 может не произойти, если X1 окажется успешным, поскольку X2 в этом случае не используется ни в предикате (там, где X1 -- ни в точке входа в do-блок), ни в дальнейших действиях (ни внутри части do-блока, связанной с этой точкой входа).

"FBD-выражения" могут быть и самостоятельными структурами, в т.ч. и в составе "гребёнки":
Вложение:
r20.png
r20.png [ 5.06 КБ | Просмотров: 4330 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 18:43 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
Вероятно, "программисткому глазу" ближе "формулы", "FBD" может помочь в случае большого количества операндов/операций (но "FBD-схемки" более проблемны насчёт автоматического расположения/выравнивания элементов, чем те же Р-схемы).

Очевидно, что Р-схема может быть вписана вовнутрь FBD-блока, также, как здесь Дракон-схема:
https://forum.drakon.su/viewtopic.php?f=62&t=4086#p75341

Отображение передачи данных возможно и внутри Р-схем, например, ниже структурная схемка взаимодействия двух параллельных конвейерных процессов:
Вложение:
r21.png
r21.png [ 6.43 КБ | Просмотров: 4330 ]

Процессы A и B, каждый с набором своих действий A1..A5 и B1..B4 соответственно, соединены последовательно, но без слияния конечной и начальной вершин (две вершины рядом). Квадратики -- знак данных/сигналов. Ромбиками соединены "одновременные" сигналы (при наличии входного X1 сосуществуют и X2 c X4). Звёздочка для сигнала Z означает начальное состояние -- в начале работы сигнал "есть в наличии". "Возникновение" данных внутри структур отмечено дугами без стрелок с квадратиками.

Так на вход процесса А (действия A1) попадают X1...X4 от внешней среды. На вход A3 -- сигнал Z после действия B1 смежного процесса (например, внутри A3 возможно "ожидание" этого события). После действия А3 возникает сигнал W -- на вход действия В1, после В1 -- сигнал Z на вход А3. После В2 возникают выходные данные Y1, предназначенные внешней среде. И в конце B3 также для внешней среды возникают результаты Y2 и Y3.

Данные на схемке отражены выборочно, в данном случае -- поток внешних данных в разрезе каждого процесса. Передача операндов опять же с помощью дуг вводит ещё одно дополнительное измерение для них (кроме упорядоченности действий). Для потребности выражения "полных контактов" (явные отношения между всеми входами/выходами) операторные схемы предпочтительнее (те же FBD, где вершина графа -- оператор/действие, дуги -- передача операндов, в Р-схемах дуги -- оператор/действие, вершина -- "состояние"), также как и "диаграммы последовательности", циклограммы и т.д. для соответствующих случаев форм представления.

Квадратик непосредственно на самой дуге означает передачу данных далее смежной структуре, напр., ниже out1 передаётся куда-то дальше на схеме, out2 -- действию fb2 (выше на схеме таких случаев нет, например, если сигнал W указать на дуге, то передача данных подразумевается не только для B1, но и для А4):
Вложение:
r22.png
r22.png [ 2.26 КБ | Просмотров: 4330 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 18:45 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
К слову, проблематика смешанных типов управления (явный поток управления и управление от данных) характерна и для упоминаемой SCADE, например. Интересующиеся могут взглянуть на статейку и презентацию ниже по поводу тамошних новых возможностей (для SCADE 6 -- 2017 г.), в частности -- см. про сontrol (activation) structures -- оператор вида "activate if ...":
* Scade 6: A Formal Language for Embedded Critical Software Development
* презентация

В SCADE/Lustre тип управления -- поток данных, основная форма текстового представления -- система уравнений, со специализированными операторами в т.ч. и для условий вычислений. Однако пользователи, всё же, хотят по возможности явный "if" для группы (в т.ч. и вложенных) уравнений сразу, что в некоторой степени эквивалентно "императивному" оператору "if". Т.е. в данном случае возникает потребность в точечном дозировании явной императивщины в управление от данных.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 18:53 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
А_МУР писал(а):
Такую гармошку, я рассматривал в плане замены, супер громоздкой иконы Выбор.

Проблематика ещё и в том, что "графические блоки" (к примеру, те же "секции" ("финализатор", "наблюдатель") выше в изложениях) в Драконе возможны лишь в стиле конструкта "выбор". Ситуация аналогична "исключениям":
https://forum.drakon.su/viewtopic.php?f=154&t=5554

При наличии на схеме "силуэта" -- "веток" с "заголовками" (и "адресами") -- второе такое же масштабное "веточно-указательное" измерение (в стиле "выбора", или даже "параллельных действий") внутри ветки как-то уже не очень-то эргономично...

Если для секций может быть как-то можно выдумать нетрадиционное использование веток в силуэте (однако с соответствующей грануляцией алгоситуаций), то всё же для локальных блоков, тех же "лямбд" к примеру, силуэт не к месту:
ДРАКОН и лямбда-выражения

Насчёт возможного применения икон в стиле "начало/конец цикла для" в качестве выделения блоков.
Здесь на форуме была ссылка на Flowgorithm:
https://forum.drakon.su/viewtopic.php?f=143&t=6742

Тамошние циклы как-то лучше локализованы, что ли, в виде собственной зоны:
Вложение:
php0Vd7nS.png
php0Vd7nS.png [ 8.88 КБ | Просмотров: 4329 ]

Вложение:
9-4.jpg
9-4.jpg [ 10.41 КБ | Просмотров: 4329 ]

Вложение:
flowchart-for-loop-flowgorithm-conditional-computer-programming-png-favpng-A49T0QjHE9q5sSgP8PXSS1Fvv.jpg
flowchart-for-loop-flowgorithm-conditional-computer-programming-png-favpng-A49T0QjHE9q5sSgP8PXSS1Fvv.jpg [ 63.18 КБ | Просмотров: 4329 ]

Однако "двумерные" возможности в данном случае ограничены. Неясно, например, как задать несколько охран ("цикл Дейкстры"), или цикл без охран, выразить выход из блока (цикл без собственных пред/постусловий -- оператор вида "loop ... end" + break/exit), и др. Видимо, для традиционной аудитории Flowgorithm-а достаточно и таких конструктов.

Но тот же цикл вида "для" в таком виде лучше, чем на манер блок-схем (использование фигур "начало..." и "конец цикла для" на одной линии-шампуре, особенно в случаях вложенности конструкций на одном маршруте):
Вложение:
Shema-2.JPG
Shema-2.JPG [ 45.52 КБ | Просмотров: 4329 ]

Причём, вероятно, именно такое сочетание вертикальных линий на маршруте -- две близко расположенных, одна из них (правая) обратная -- неплохой индикатор в тех случаях, когда схема масштабная и на экран всё не влазит -- линия в обратном направлении может быть тогда, когда их две рядом. Если же наблюдаешь одну линию-маршрут, то предполагается следование вниз, соответственно экран необходимо прокручивать далее вниз для дальнейшего анализа (вместо следования вниз, а потом вдруг обнаруживается, что линия обратная ...).

(на картинках выше есть вариант прямоугольника-объявления (фигура declare) для дефиниции переменных -- на всякий случай...)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 18:59 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
К вопросу насчёт локальных блоков. Ранее был упомянут Kotlin в контексте реализации автоматов/корутин. Рассмотрим пару примеров из документации по данной тематике, как раз этот язык "славится" обильным использованием "лямбд" (реализуя т.н. паттерн "builder").
Ниже пример реализации операции "выбора событий":
https://kotlinlang.org/docs/reference/coroutines/select-expression.html#selecting-on-close
Код:
suspend fun selectAorB(a: ReceiveChannel<String>, b: ReceiveChannel<String>): String =
    select<String> {
        a.onReceiveOrNull { value ->
            if (value == null)
                "Channel 'a' is closed"
            else
                "a -> '$value'"
        }
        b.onReceiveOrNull { value ->
            if (value == null)
                "Channel 'b' is closed"
            else   
                "b -> '$value'"
        }
    }

Выражение вида "func {...}" есть сокращение от "func({...})" -- вынос аргумента-функции за скобки, чтобы "лямбду" проще представить как обособленный блок. Функция select в качестве аргумента принимает функцию, исполнив её осуществляется ожидание и обработка событий -- определенных конструктов, которые были реализованы внутри лямбда-функции. Внутри этой лямбды в примере вызываются методы onReceiveOrNull у двух объектов, которые осуществляют "подписку" на соответствующее событие (получение данных или закрытие канала), где в качестве аргумента-лямбды указывается обработчик события. В языке ключевое слово suspend рядом с fun (функции с возможностью приостановки или выхода во внешнею среду) означает неявную передачу скрытого аргумента для функций, представляющего из себя специальный контекст исполнения. Через этот скрытый параметр некоторые функции взаимодействуют между собой. Так функции вида onReceiveOrNull "понимают" то, что где-то "выше" имеется select и "знают", что с ним делать. Функция select ожидает (приостанавливает поток) пока не произойдёт какое-то событие из заданных и возвращает результат, полученный от функции-обработчика события.
Вместо встроенных специализированных операторов применяются прикладные функции.

Сама семантика, вкладываемая в организацию сопрограмм, второстепенна в данном случае. Сейчас интересует возможная форма графического представления блоков. На Р-схемах операции с лямбдами можно выразить через те же дуги-блоки (с "разрывом" вершин), указывая операцию над дугой и аргументы лямбды (если есть) под дугой. Операторы with и select ранее, использующие ту же дугу-блок, не предполагают надписи на дуге. В общем случае, если есть надпись над дугой-заголовком, то технологический язык должен предусмотреть сопоставление с тем, что указано в заголовке и содержимым блока:
Вложение:
r23.png
r23.png [ 9.92 КБ | Просмотров: 4329 ]

Выше традиционная императивная схема (нет ничего "магического" декларативного), тело блока для функции select состоит из последовательности исполнения функций a.onReceiveOrNull и b.onReceiveOrNull.
Например, вызов b.onReceiveOrNull могли бы сделать по какому-то условию:
Код:
suspend fun selectAorB(a: ReceiveChannel<String>, b: ReceiveChannel<String>): String =
    select<String> {
        a.onReceiveOrNull { value ->
            if (value == null)
                "Channel 'a' is closed"
            else
                "a -> '$value'"
        }
        if (Cond(...)) {
            b.onReceiveOrNull { value ->
                if (value == null)
                    "Channel 'b' is closed"
                else   
                    "b -> '$value'"
            }
        }
    }

Вложение:
r24.png
r24.png [ 11.41 КБ | Просмотров: 4329 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 19:05 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
Рассмотрим ещё один пример:
https://kotlinlang.org/docs/reference/coroutines/select-expression.html#selecting-deferred-values
Код:
fun CoroutineScope.asyncString(time: Int) = async {
    delay(time.toLong())
    "Waited for $time ms"
}

fun CoroutineScope.asyncStringsList(): List<Deferred<String>> {
    val random = Random(3)
    return List(12) { asyncString(random.nextInt(1000)) }
}

fun main() = runBlocking<Unit> {
    val list = asyncStringsList()
    val result = select<String> {
        list.withIndex().forEach { (index, deferred) ->
            deferred.onAwait { answer ->
                "Deferred $index produced answer '$answer'"
            }
        }
    }
    println(result)
    val countActive = list.count { it.isActive }
    println("$countActive coroutines are still active")
}

Выше при функции select (внутри main) возникает многоуровневая конструкция вложенности блоков. На Р-схеме:
Вложение:
r25.png
r25.png [ 25.68 КБ | Просмотров: 4328 ]

Выше "механический" перевод текстовой формы в "графику". Если транслятору известны "спецэффекты" конструкций, то перевод может быть уточнен таким образом:
Вложение:
r26.png
r26.png [ 26.33 КБ | Просмотров: 4328 ]

Выше внутри функции CoroutineScope.asyncString действие "delay(time.toLong())" представлено как структура-блок с "выходом во внешнюю среду" (с паузой/ожиданием) -- дуга с "разрывом" вершины и "точкой" (также, как и для операторов вида select/await ранее). Аналогично точкой помечен вызов функции select внутри main. Там же вызов list.withIndex().forEach представлен как "петля" (блок под двойной дугой, с надписью на дуге, также как и для цикла for).

Р-схемы по сути есть блоки как таковые, выражающие последовательное, параллельное, вложенное соединение структур (для схем любого вида, не только алгоритмические), плюс уточнение семантики через спецвершины.
Так, например, параллельный цикл может быть задан в таком виде:
Код:
parfor[NumCPUs] i in range(a) do
   a[i] := b[i] + c[i];
end;

Вложение:
r27.png
r27.png [ 2.15 КБ | Просмотров: 4328 ]

Причём в технологическом языке для цикла может быть использован либо встроенный оператор, либо прикладная функция (с лямбдой), но графическая структура будет одна и та же.

Вложенность структур может как помогать/облегчать понимание и реализацию алгоритмов, так и усложнять. Это прикладные вопросы предметки. Но важно отсутствие ограничений в возможностях со стороны средств визуального представления.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 19:11 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
А_МУР писал(а):
Такую гармошку, я рассматривал в плане замены, супер громоздкой иконы Выбор.

"Выбор" в Р-схемах можно также реализовать через те же блоки и компактно (под последним подразумевается некоторые ситуации -- см. далее):
Код:
  case x, y of
  | _, 0: calc_yzero(x)
  | 0, _: calc_xzero(y)
  else    calc_xy(x, y)
  end;

Вложение:
r28.png
r28.png [ 3.55 КБ | Просмотров: 4328 ]

Символ "_" в образце для сопоставления -- игнорирование или любое значение.
Если в технологическом языке символ "|" используется как операция или как-то иначе (напр.: "побитовое или"), то возможно какое-то иное графическое обозначение "защиты" или "варианта", например, со стрелкой:
Вложение:
r29.png
r29.png [ 3.57 КБ | Просмотров: 4328 ]

В одном предикате может быть несколько образцов для сопоставления:
Вложение:
r30.png
r30.png [ 2.59 КБ | Просмотров: 4328 ]

"Выбор" для установки переменных:
Код:
  var z := case x, y of
           | _, 0: calc_yzero(x)
           | 0, _: calc_xzero(y)
           | _   : calc_xy(x, y)
           end;

Вложение:
r31.png
r31.png [ 3.63 КБ | Просмотров: 4328 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 19:13 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
"Pattern matching" верхнего уровня -- операция сопоставления в самом начале алгоритма с его аргументами:
Код:
  fn calc(x, y: int): int =
    case x, y of
    | _, 0: calc_yzero(x)
    | 0, _: calc_xzero(y)
    | _   : calc_xy(x, y)
    end;

  (* сокращённая форма: *)

  fn calc(x, y: int): int =
    | _, 0: calc_yzero(x)
    | 0, _: calc_xzero(y)
    | _   : calc_xy(x, y)
  ;

Вложение:
r32.png
r32.png [ 4.44 КБ | Просмотров: 4328 ]

Сопоставление верхнего уровня для лямбды:
Код:
  var z = some_fn(true, 10) { x, y =>
    | _, 0: calc_yzero(x)
    | 0, _: calc_xzero(y)
    | _   : calc_xy(x, y)
  };

Вложение:
r33.png
r33.png [ 4.67 КБ | Просмотров: 4328 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 19:16 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
"Выбор" как "защита" в операторе with:
Код:
  with
    x = calcx(...);
    y = calcy(...);
  case x, y of
  | _, 0 do calc_yzero(x)
  | 0, _ do calc_xzero(y)
  else      calc_xy(x, y)
  end;

  (* сокращённая форма: *)

  with
    x = calcx(...);
    y = calcy(...);
  | _, 0 do calc_yzero(x)
  | 0, _ do calc_xzero(y)
  else      calc_xy(x, y)
  end;

Вложение:
r35.png
r35.png [ 4.46 КБ | Просмотров: 4328 ]

Выше после дефиниции переменных указана "полка", под которой определяется выражение для сопоставления. В случае сопоставления со всеми введенными переменными возможна краткая форма без "полки":
Вложение:
r36.png
r36.png [ 4.19 КБ | Просмотров: 4328 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 19:19 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
Такие же принципы "выбора" и в тех случаях, когда новые имена переменных возникают внутри образца (варианта) для сопоставления (традиционно для функциональных ЯП и прочих условно новомодных):
Код:
  var z = some_fn(true, 10) {
    | x, 0 => calc_yzero(x)
    | 0, y => calc_xzero(y)
    | x, y => calc_xy(x, y)
  };

Вложение:
r37.png
r37.png [ 4.69 КБ | Просмотров: 4327 ]

На схемках выше и ранее квадратиками обозначается ввод новых переменных и возврат результатов. Это опционально, можно убрать (результаты возникают в конце структур или при наличии соответствующих структурных переходов, технологический язык может ограничивать возникновение новых имён внутри структур, или же квадратик можно задействовать лишь в тех случаях, где в текстовом языке локально возникает ключ. слово вида "var", и т.п.).
Например, сопоставление верхнего уровня (звёздочка -- отсутствие данных, ноль, nil, null и т.п.):
Код:
  fn calc(int, int) real =
    | x, * => calc_yzero(x)
    | *, y => calc_xzero(y)
    | x, y => calc_xy(x, y)
  ;

Вложение:
r38.png
r38.png [ 4.46 КБ | Просмотров: 4327 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2020 19:20 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 396
В общем, у меня пока нет предложений, как можно подобные Р-"горизонтальные конструкты", представленные здесь, повернуть в вертикальное "Дракон-положение", а хотелось бы...

У Р-схем свои недостатки. Кроме того, что диаграммы не есть блок-схемные производные (требуют освоения), нагрузка дуг ограничена (схема должна быть аля график работ, для обозримости структуры этих работ). Дуги на пол-экрана или весь лист бумаги мало полезны (если они не "поглощающие", т.е. дуги-определители блоков). В Дракон-е "квадратик" на весь экран "проглатывается" лучше (если такое явление, всё же, как-то оправдано предметкой).
Зато Р-схемы дисциплинируют насчёт сокращения идентификаторов. Тот же исходный оператор with в Паскале (он не такой, как выше) когда-то и возник именно для этих целей. Оправданы и такие приёмы как локальные алиасы для параметров в след. стиле (подобное решение иногда встречается в некоторых ЯП):

fn prepare(ct container: DataContainer; ln length, cp capacity: int);

, где для каждого параметра введено два имени: краткое (для использования далее как "математическая абстракция") и условно полное (обозначающее предметный смысл).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2008-2024, участники конференции «DRAKON.SU», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB