Михаил Кузьмин писал(а):
Теперь о связи событий и понятий. Как уже было определено событие это изменение состояния. Этих изменений всего 16 классов с именами нового состояния. Все остальные события создаются как концепты одного из этих классов над выражениями.
[...]
Хороший вопрос был по запутанности когда и как все это происходит и как связано с транслятором и работой.
Транслятор создает концепты с соответствующими подписками на событий которые нас интересуют в каком-то смысле. Работа начинается с адресации этого концепта.
Как уже рассказывалось, адресация начинается с проверки наличия подписок и проверки выражений. Если подписки есть, то происходит анализ выражения и если оно истинно, то осуществляется переход по подписке. [...]
Вы регулярно повторяетесь в своих обширных изложениях, но семантику некоего "исчисления событий" так и не представили.
Михаил Кузьмин писал(а):
Я жду когда будут вопросы по счетчику электричества. Не все сразу надо вываливать. Постепенно ввожу к новому образу мышления.
Попробуем активировать (или "адресовать" ?) нужное "событие" (к тому же представленный транслятор также "молчит", лишь выдает окошко с исключительной ситуацией).
Исходный вариант примера про счётчик:
Код:
@ Byte (Interval, Count) Class ElectricMeter #Класс с параметрами времени в миллисекундах и счетчик суммирования»
:: | {Timer T (Interval) ! | { Tick Timer.Start Counter=Count} # Создание таймера, создание подписки, сохранение счетчика при инициализации.»
{ ‘ Создание свойств
Byte Counter :: Count #Количество тиков таймера до секунды при инициализации»
:= | Counter -=1 #Ведем счетчик. При каждой записи вычитаем 1»
Null | {Counter =Count) Value =(Voltage/Counter)* (Electricity/Counter)} #При событии 0, формируем счет и восстанавливаем значение счетчика. Как произведение средних значений тока и напряжения.»
‘ Накапливаем значение тока и напряжения
Float { Voltage := | @( Float X ) Voltage += X # Суммирование значения при событии Write»
=: | Voltage =0 # При чтении обнуляем счет.»
, Electricity := | @( Float X ) Electricity + =X # Суммирование значения при событии Write»
, Value=0 := | @( Float X ) Value+ X #Значение счетчика наращиваем при записи».
)
‘ По каждому тику ведем счетчик, читаем значение тока и напряжения по физическому адресу и суммируем
Void Tick : | Counter (1) Voltage( Read “vvvv”) Electricity (Read “eeee”)
)
Освоить такой формальный язык быстро непросто неподготовленному. Неясно, например, непарное сочетание скобок вида "{..)" в выражениях аля "Null | {Counter =Count)...}", "Float {...)" и пр. является целенаправленным и что-то означает (по аналогии с "#...»") или это просто опечатки (здесь на форуме лучше использовать теги для "кода", в этом случае при отображении применяется моноширинный шрифт и сохраняются отступы).
Попробуем чуть расширить задачку: ввести второй таймер для логирования, добавить некий поправочный коэффициент ("концепт" Factor) -- взят с потолка, лишь бы как-то слепить выражения для выяснения сути порядка вычислений, сама предметка "счётчика" как такового неважна:
Код:
@ Byte (Interval, Count) Class ElectricMeter #Класс с параметрами времени в миллисекундах и счетчик суммирования»
:: | {Timer T (Interval) ! | { Tick Timer.Start Counter=Count}
| {Timer T2 (Interval*Factor) ! | { Tick2 Timer.Start} # Создание таймеров, создание подписки, сохранение счетчика при инициализации.»
{ ‘ Создание свойств
Byte Counter :: Trunc(Factor*Count) #Количество тиков таймера до секунды при инициализации»
:= | Counter -=1 #Ведем счетчик. При каждой записи вычитаем 1»
Null | {Counter =Count) Value =(Voltage/Counter)* (Electricity/Counter*Factor) + Voltage*Factor} #При событии 0, формируем счет и восстанавливаем значение счетчика»
Null | Log(Factor, Value)
‘ Накапливаем значение тока и напряжения
Float { Voltage := | @( Float X ) Voltage += X # Суммирование значения при событии Write»
=: | Voltage =0 # При чтении обнуляем счет.»
, Electricity := | @( Float X ) Electricity += X # Суммирование значения при событии Write»
, Value=Factor*0.0234 := | @( Float X ) Value += X #Значение счетчика наращиваем при записи».
, Factor=Interval/Counter =: | Factor =Rand(0, 1) # При чтении устанавливаем как случайное значение».
)
‘ По каждому тику ведем счетчик, читаем значение тока и напряжения по физическому адресу и суммируем
Void Tick : | Counter (1) Voltage( Read “vvvv”) Electricity (Read “eeee”)
‘ логируем текущие данные
Void Tick2 : | Log(Factor, Value)
)
"Протокол о намерениях" выше, вероятно, некорректный, моделировать приходится по аналогии. Ранее было указано про отсутствие функций/процедур, однако наблюдаются какие-то "концепты" как Read (с "аргументами", что ли), аналогично допускаем тогда существование каких-то Trunc (обрезка или округление вещественных), Rand (генерация случайного значения из диапазона), Log (запись данных куда-то).
Итак, пусть где-то будет осуществлена "адресация" (или какой необходим термин ?) концепта ElectricMeter, например, также как создаются/адресуются выше объекты Counter, Voltage и т.п. -- в виде аля "ElectricMeter Meter (..., ...)" (или как ?). Наблюдаются "подписки" на инициализацию в разном виде различных элементов. Как должен действовать транслятор в след. ситуациях?
В начале тела ElectricMeter перед скобками "{ ‘ Создание свойств ...)" определено событие "::" ("инициализация"), видимо, отсюда начинается "пляска". Выражение "{Timer T (Interval) ! | { Tick Timer.Start Counter=Count}", вероятно, означает "адресовать/инициализировать" концепт класса Timer, в случае успеха (подписка на "!") инициализировать и запустить Tick. Что должно быть в случае неуспеха -- исключение/аварийный останов и т.п. или ничего, т.е. события "!" нет, и чтобы как-то отреагировать на проблему необходимо каким-то способом подписываться на событие "инверсия !" или "инверсия инициализации"? Если после выполнения "Tick Timer.Start" произойдёт "тик" до того как будет завершена инициализация "экземпляра класса" (до отработки всех инициализаторов), будет ли реакция на событие "Tick: ..." (при неполной инициализации концепта ElectricMeter) или нет (возможные тики будут "потеряны" до конца отработки всех инициализаторов или до конца исполнения/интерпретации зоны "{ ‘ Создание свойств ...)")?
В выражении "Timer T2 (Interval*Factor)" есть обращение (адресация ?) к концепту Factor, имеющий свой инициализатор "Factor=..." (по аналогии с "Value=0" в оригинальном примере), однако заданный где-то там, далее в зоне "{ ‘ Создание свойств ...)". В этом случае значение Factor при вычислении "Interval*Factor" уже будет предварительно инициализировано или неопределенным/случайным? Или так вообще нельзя "выражаться"?
Для концептов Voltage, Electricity не заданы инициализаторы (нет ни события "::", ни установки свойства "=" -- как-то так ведь необходимо интерпретировать выражение вида "Value=0" ?). В этом случае начальное значение как-то задаётся неявно по умолчанию (напр., заполнение нулём) и когда именно или является неопределенным (или как осуществляется "суммирование" в дальнейшем)?
В выражении "{ Tick Timer.Start Counter=Count}" часть "Counter=Count", видимо, следует понимать как установка свойства "=". В то же время для Counter определен и иной инициализатор в виде события "Counter ::". Два раза выполняется вычисление? В оригинальном примере содержание двух инициализаторов одинаковое ("адресация" Count), во втором -- нет, какое значение в итоге в этом случае?
Для Counter определено событие ":=" ("запись", с реакцией "уменьшение на 1"). В выражении при событии Null:
Null | {Counter =Count) Value = ...Counter...}
в первой части определена установка "Counter =Count". Далее (последовательно, вроде бы, согласно "правилам групп") при установке "Value = ..." применяется Counter, по контексту теперь Counter должен реально содержать Count, иначе нет смысла вычислять Value. Следовательно, тогда события возникают "мгновенно при адресации концепта". Возникает ли и событие ":=" при установке "Counter =Count" (т.е. установили Counter в Count и сразу же возникла реакция "Counter -=1", и далее при вычислении "Value = ...Counter..." значение Counter уже уменьшенное на 1, и смотреть на предыдущую запись "Counter =Count" уже нет смысла)? Если нет, то когда возникают события ":="? Лишь только в выражениях вида "Counter (1)" (в обработчике "Tick : ...")? Чем такое выражение семантически отличается от прочих операций-уставок? Происходит ли событие ":=" при "исполнении" выражений инициализации "{ Tick Timer.Start Counter=Count}" и "Byte Counter :: ..."? Если нет, то почему? Если да, то в каком порядке?
Если при исполнении "Counter =Count" во время реакции на Null значение Count равно 0, и следовательно Counter приобретает значение 0, происходит ли новая реакция на событие Null и в каком порядке (по отношению к предыдущей реакции)? Как связана такая возможная реакция с событием ":="?
Возможно ли две и более подписки на событие Null концепта Counter как во втором примере или такие конструкции недопустимы? Если "норм", то их порядок, видимо, последовательный, однако как две подписки отработают во всех перечисленных случаях выше (какое актуальное состояние Counter будет в каждой возможной реакции в отношение вероятных повторов события Null и возникновения смежного ":=")?
Когда и как выполняются события "=:" (при "чтении")? Принцип един -- "мгновенно при адресации концепта"? Во втором примере расчёт Value задан иначе:
Null | {Counter =Count) Value =(Voltage/Counter)* (Electricity/Counter*Factor) + Voltage*Factor}
Для концептов Voltage и Factor заданы реакции на событие "=:", изменяющие соответствующие значения. В выражении "Value = ..." выше по два раза "читаются" Voltage и Factor. При каком-то чтении значения этих концептов изменятся и в каком порядке? Или же как-то фиксируется, что ли, событие Null и при выполнении всей подписки, а точнее двух в данном случае, любое обращение к концептам интерпретируется как условно одно чтение? Или для каждой подписки на Null (в целом любого события) своя отдельная фиксация?
Концепты Counter и Value имеют инициализаторы:
Byte Counter :: Trunc(Factor*Count)
Value=Factor*0.0234
В двух случаях есть "адресация" к Factor, со своей инициализацией:
Factor=Interval/Counter
Такие ссылки, как минимум в инициализаторах, допустимы? В каком порядке будут отработаны выражения (и когда именно в разрезе всего концепта ElectricMeter)? Будет ли два раза (или более) "инициализирован" Factor?
Инициализация Factor "адресуется" к концепту Counter -- возникает "рекурсивная адресация", что ли. Такие конструкции валидны или транслятор должен отбросить модель? Если транслятор пропускает, что возникает при исполнении/интерпретации -- зацикливание, аварийный останов или ничего? В последнем случае необходимы какие-то подписки на "инверсию успешного выполнения/инициализации" или что может быть использовано для "подписки" (какой-то сигнализации и реакции) на проблему?
Как работают реакции на "Tick : ..." и "Tick2 : ... " -- если во время отработки какого-то события возникает иной тик, то будет ли прерываться исходная работа, что происходит с состоянием всего концепта ElectricMeter, с диспетчеризацией событий и пр.?
В общем, как в целом понимать некий клубок "адресаций", какой должен быть образ мышления?
P.S. Заниматься виртуальным отладчиком на форуме утомительно, однако...