Выполнение событийно-управляемого программирования в Clojure / ClojureScript - PullRequest
7 голосов
/ 02 апреля 2012

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 02 апреля 2012

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

2 голосов
/ 02 апреля 2014

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

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

1 голос
/ 02 апреля 2012

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

...