Абстракции, метаморфозы и язык (DSL?)

Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Абстракции, метаморфозы и язык (DSL?)

Post by Palych »

Радуйтесь, жрецы компьютерных наук, хранители тайных знаний!
А что сейчас нового придумали в представлении асинхронных вызовов?
Допустим - есть некий API, которому можно вешать слушателей на события и выполнять некие действия.
Задача: нарисовать некий сценарий с набором шагов:

Code: Select all

(Event1){Action1}
(Event2){Action2}
(Event3){Action3}
Чтобы описывать именно так: последовательно.
А под капотом чтобы вешались слушатели на все события, а по приходу callback проверялась позиция интерпретатора сценария (события не могут повторяться) и выполнялось соответствующее действие. Если порядок не совпадает - прерываем выполнение. Так же нужно учитывать что некоторые события должны прерывать сценарий на любом шаге, что-то типа try/catch.
Для полноты картины неплохо бы и if/else/loops иметь.

Собственно вопрос: есть ли в современных языках способ просто и элегантно описать такие сценарии?
Чтобы казалось что пишешь обычную программу?

Пока мне на ум приходят конструкции типа грамматики парсеров, как bison/antlr:

Code: Select all

script: event1, event2, event3;

event1: {action1()}
event2: {action2()}
event3: {action3()}
По идее наверное можно нарисовать сканер для antlr который будет на события слушателей вешать...
Но это как-то громоздко...

В общем, если кто-то что-то понял - прошу высказываться...
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Абстракции, метаморфозы и язык (DSL?)

Post by Интеррапт »

"Если порядок не совпадает - прерываем выполнение." - уже обозначает, что нужно посылать одно сообщение за другим, пусть даже это будут асинхронные сетевые вызовы. Строится обычная очередь сообщений (сообщение может содержать любые параметры и ожидаемый ответ, типа "event1" и соответственно с каким-то action) посредством какого-нибудь BlockingQueue и туда отправляются сетевые запросы. Если пришедшее сообщение не совпадает с ожидаемым - то прерываем все это дело.
Уж чего тут точно городить не нужно - это грамматики парсеров.
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Re: Абстракции, метаморфозы и язык (DSL?)

Post by Palych »

Интеррапт wrote:"Если порядок не совпадает - прерываем выполнение." - уже обозначает, что нужно посылать одно сообщение за другим, пусть даже это будут асинхронные сетевые вызовы. Строится обычная очередь сообщений (сообщение может содержать любые параметры и ожидаемый ответ, типа "event1" и соответственно с каким-то action) посредством какого-нибудь BlockingQueue и туда отправляются сетевые запросы. Если пришедшее сообщение не совпадает с ожидаемым - то прерываем все это дело.
Уж чего тут точно городить не нужно - это грамматики парсеров.
В данном случае прикол в том, что слушателей нужно развесить заранее, а потом уже посылать сообщения одно за другим.
С программной точки зрения понятно как сделать (вроде бы).
Интересно как сделать так, чтобы визуально скрипт выглядел как программа...
Может в виде цепочки функций:

Code: Select all

script.add(new Event(...), new action(...)).add(new Event(...), new action(...))...

Return to “Вопросы и новости IT”