Программирование, управляемое событиями, в Clojure/ClojureScript

Я пытаюсь понять, как моделировать события в ClojureScript. Спроектировать очередь событий в JavaScript очень просто. Вы просто сохраняете (изменяемый) массив функций и предоставляете вспомогательные функции для добавления или удаления обратных вызовов из массива. Когда вы инициируете событие, просто просмотрите все обратные вызовы, перечисленные в массиве, и вызовите их один за другим.

Эта парадигма далека от функционального стиля — например, нет смысла запускать обратные вызовы, если они не имеют побочных эффектов. Более того, это реализовано с использованием изменяемого массива. Тем не менее мне кажется, что в ClojureScript нужно уметь программировать, управляемое событиями, чтобы делать что-то полезное. Теперь я знаю, что Google Closure уже реализует библиотеку событий, но мой вопрос касается ее реализации изначально.

Поскольку все основные типы данных Clojure/ClojureScript являются неизменяемыми, каким идиоматическим способом можно было бы реализовать этот механизм? Сменить реферала? Прибегаете к изменяемым структурам данных с хоста (Java или JavaScript)?

Если я правильно понимаю, агенты, возможно, являются правильным инструментом в Clojure, но я вижу, что в настоящее время они не реализованы в ClojureScript.


person Andrea    schedule 01.04.2012    source источник


Ответы (3)


Clojurescript One имеет библиотеку, one.dispatch это хорошая отправная точка. В вики есть примеры использования здесь

person sw1nn    schedule 02.04.2012
comment
И он использует ту же концепцию атома для хранения всех обработчиков событий. - person Ankur; 02.04.2012
comment
404 не найдено. Вы не знаете, не было ли оно перемещено куда-то еще? - person Matt Moran; 28.06.2017

По состоянию на 2013 год лучшим способом обработки событий в clojure является превосходная библиотека core.async:

core.async обеспечивает управляемое событиями программирование с каналами способом, очень похожим на язык Go.

person mikera    schedule 02.04.2014

Изменение ref/atom было бы хорошо, если вы хотите реализовать такое решение, поскольку это то, что делает большинство библиотек clojure и т. д., когда у них возникает такая ситуация, когда им нужно хранилище для хранения/удаления материала во время выполнения.

person Ankur    schedule 02.04.2012