2012-04-01 10 views
7

Estoy intentando comprender cómo modelar eventos en ClojureScript. Diseñar una cola de eventos en JavaScript es fácil. Simplemente mantiene una matriz (mutable) de funciones y proporciona funciones de ayuda para agregar o eliminar devoluciones de la matriz. Cuando active el evento, simplemente revise todas las devoluciones de llamada enumeradas en la matriz e inícielas una después de la otra.Haciendo programación dirigida por eventos en Clojure/ClojureScript

Este paradigma está lejos del estilo funcional; por ejemplo, no tiene sentido desencadenar las devoluciones de llamada a menos que tengan efectos secundarios. Además, se implementa utilizando una matriz mutable. Aún así, me parece que en ClojureScript uno necesita poder hacer una programación basada en eventos para hacer algo útil. Ahora, sé que Google Closure ya implementa una biblioteca de eventos, pero mi pregunta es sobre cómo implementarla de forma nativa.

Dado que todos los tipos de datos Clojure/ClojureScript básicos son inmutables, ¿cuál sería una forma idiomática de implementar este mecanismo? ¿Cambiar una referencia? ¿Recurriendo a estructuras de datos mutables del host (Java resp JavaScript)?

Si entiendo correctamente, los agentes son posiblemente la herramienta adecuada en Clojure, pero veo que actualmente no están implementados en ClojureScript.

Respuesta

5

Clojurescript One tiene una biblioteca, one.dispatch que es un buen punto de partida. El wiki tiene ejemplos de uso here

+0

Y utiliza el mismo concepto de átomo para almacenar todos los controladores de eventos – Ankur

+0

404 no encontrados - ¿sabe si se ha movido a otra parte? –

1

Cambiar una referencia/átomo estaría bien si desea implementar dicha solución, ya que eso es lo que hace la mayoría de las bibliotecas de clojure cuando tienen una situación en la que necesitan una tienda para almacenar/eliminar cosas en tiempo de ejecución.

2

A partir de 2013, la mejor manera de lograr el control de eventos en clojure es la excelente core.async biblioteca:

core.async permite la programación orientada a eventos con canales de una manera bastante similar al lenguaje Go.

Cuestiones relacionadas