Выполнение групп в недетерминированной машине. Кажется интересные методы, ну есть вопросы для посоветоваться
Так как подстрочные и надстрочные знаки здесь не печатаются, я обозначил их стрелками вверх/вниз
Результатом выполнения любого концепта является метасвойство (|) инициирующее одноименное Метасобытие перечислимого типа Boolean имеющего два значения «!» —Истина и «¬» -Ложь.
Успешное выполнение концепта это выполнение со значением свойства «|» -Истина.
Каждый класс концептов имеет свое назначение и специфику выполнения.
Для успешного выполнения содержимого групп Collection необходимо успешное выполнение всех элементов группы (семантическое И).
Концепты группы Array выполняется как выборка из Min элементов имеющих успешное выполнение (семантическое Или) Max раз.
Выполнение групп концептов порождаемых скобками Collection и Array зависит от типа подстрочных и надстрочных значений после закрывающей скобки.
Если это значения типа Token, то это свойства соответственно Min и Max которые определяют минимальное и максимальное значение успешных выполнений содержимого группы необходимых для успешного выполнения группы. По умолчанию Min=1, Max=0 что соответствует одному обязательному выполнению группы Collection и выборке одного элемента один раз группе Array.
Успешное выполнение группы заключается в успешном выполнении содержимого группы >=Min и <=Max раз. При значении Min=0 выполнение группы считается успешным даже если не было успешного выполнения ни одного элемента группы.
Классы групп Collection и Array порождают соответственно группы Do и Select.
Определение понятия Заголовок.
Define
Заголовок { { «Формальные параметры» }
↓
0 Class { Name}
↓
0 { Help}
↓
0}
Т.е. Заголовок начинается с, возможно, (подстрочное значение 0) Формальных параметров, затем обязательного имени класса за которым, возможно, имя создаваемого концепта и, возможно, свойство Help.
Определения понятия Word.
Define Word { Letter } ↑15 ‘От одной до 16 букв.
Define Name [Word {«"» {Mark} ↓ 0 ↑ 15 «"»}]
Понятие Name это либо слово, либо последовательность знаков (до 16) в двойных прямых скобках.
[a=b+c d=e*f+a] ↓ 2 ‘Параллельное выполнение двух присваиваний два раза.
Надстрочное значение типа Token (Max) — ограничивает число выполнений группы.
Надстрочное значение типа Boolean (While) допускает выполнение группы пока это свойство истинно с проверкой перед выполнением группы.
Подстрочное значение для групп Collection типа Boolean (Until) ограничивает выполнение группы пока False с проверкой после выполнения группы.
Подстрочное значение перечислимого типа для групп Array (Select) выполняет только элемент группы с индексом этого значения.
Вычисление NOD. Значения a и b передаются как параметры.
@Int32( a, b) Int32 Nod =: a~b |{ =Nod =a
> a=a-b (Пример 1)
<b=b-a}
Это стандартный синтаксис подписок на отработку событий сравнения параметров выполняемых диспетчером событий. Проблема только в том, что это первый шаг алгоритма Евклида, и надо бы его зациклить для выполнения операции сравнения следующего шага алгоритма, но тогда надо заново адресоваться к Nod в подписках пока не равенство а и b что б опять выполнилась операция сравнения и повторилась подписка. Потому применим другой подход. Используем группы класса Do, расширяющие возможности выполнения групп. А именно. Группа класса Do :
Надстрочным значением имеют логическое выражение While и выполняются до тех, пор пока это значение истинно реализуя, таким образом, цикл.
Подстрочное значение для группы Collection (круглые или фигурные скобки) логическое значение Until, а для групп Select (квадратные скобки) перечислимое значение — индекс выполняемого элемента группы (свойство Select).
Итак, вычисление НОД выглядит так:
@Int32( a, b) Int32 Nod =: [ Nod =a
a=a-b (Пример 2)
b=b-a] ↓ a ~ b ↑ a ≠ b
Проверка свойства While осуществляется до выполнения группы (но после вычисления свойства Select), а свойство Until проверяется после выполнения группы.
Выполнение группы начинается с операции сравнения, результат которой — перечислимое значение и квадратные скобки, стало быть выполняется это свойство Select. Выполнение:
Шаг 1. Проверяем свойство While и при не истинности останов. При истинности шаг 2.
Шаг 2. Выполняется один из элементов группы с индексом перечислимого результата сравнения свойства Select и Шаг 1.
Реализация оператора If группой Do. В группа If выполняет первый или второй оператор группы в зависимости от значения логической переменной F:
[If a=a +b a=a*b] ↓ F
Хотя реализация этого оператор проще с помощью подписок.
F |{! a=a +b ¬ a=a*b}
Определим текстовую группу Bracket открывающих скобок.
[Bracket «(», «{», «[»]
Синтаксис концепта или группы. (С проверкой на соответствие закрывающих скобок открывающим) Параметром служит элемент группы (концепт In).
@ Concept In Define Group {Bracket S:=Bracket | {In} ↑ 15 [«)» «}» «]»] S ¬ In }
При адресации понятию Group анализ начинается с присвоения перечислимого значения S, которое обращается к группе Bracket, результат которого анализируется подпиской. Если операция присвоения закончилась не успешно ( Лексема не скобка метасвойство равно ¬), то это просто концепт.
При успешном присвоениии (обнаружив открывающую скобку) S имеет значение индекса обнаруженной скобки анализируем на повторение содержимого группы (In) определенного как параметр до 16 раз. После чего заканчиваем разбор скобкой необходимого вида определенной группой закрывающихся скобок Select выбирающей необходимую закрывающую скобку перечислимым значением S.
Разбор арифметического выражения.
Define Expression {Bracket S= Bracket | { ! { [ «+» «-» ] ↓ 0 ↑ 1 Expression {«)» , «}» «]»} ↓ S }
¬ {Значение {[ «+» «-»«*» «:» ] ↓ 1 ↑ 1 Expression } ↓ 0 ↑ 16 }
При наличии открывающей скобки «!» проверяем на наличие знака префиксной операции +/- перед выражением, далее выражение, за которым должна следовать закрывающая скобка выбранная из группы закрывающих скобок группой Select определяемой подстрочным значением перечислимого типа.
При отсутствии скобки «¬» проверяем понятие Значение за которым может следовать один из знаков операции за которым обязательно должно следовать выражение. Значение это либо непосредственно цифры, либо адрес на значение соответвующего типа.
Определение групп Do и Select не только типом скобок, но и непосредственным указанием класса. Тип скобок тогда не имеет значения.
Определим группу событий Events
{Events F1 Null F2 Null F3 Null }
И группу Select операторов OP.
Select {Op Op1 Op2 Op3} ↓ Events
Обращаясь к группе Op выполнится только оператор с индексом истинного события в группе Events
Реализуя функционал привычного оператора Select Case только с разделением на две части, одна из которых определяет индекс, а вторая содержит выполняемые операторы.
16 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів