2012-04-01 16 views
7

Sto cercando di capire come modellare gli eventi in ClojureScript. Progettare una coda di eventi in JavaScript è facile. Basta mantenere una matrice (mutabile) di funzioni e fornire funzioni di supporto per aggiungere o rimuovere i callback dall'array. Quando si attiva l'evento, è sufficiente scorrere tutti i callback elencati nell'array e richiamarli uno dopo l'altro.Programmazione event-driven in Clojure/ClojureScript

Questo paradigma è lontano dallo stile funzionale, ad esempio non è possibile attivare i callback a meno che non abbiano effetti collaterali. Inoltre è implementato utilizzando una matrice mutabile. Ancora mi sembra che in ClojureScript sia necessario essere in grado di fare programmazione basata sugli eventi per fare qualcosa di utile. Ora, so che Google Closure implementa già una libreria di eventi, ma la mia domanda riguarda l'implementazione nativa.

Poiché tutti i tipi di dati Clojure/ClojureScript di base sono immutabili, quale sarebbe un modo idiomatico per implementare questo meccanismo? Cambiando un ref? Ricorrere a strutture dati mutabili dall'host (Java resp JavaScript)?

Se ho capito bene, gli agenti sono probabilmente lo strumento giusto in Clojure, ma vedo che attualmente non sono implementati in ClojureScript.

risposta

5

Clojurescript One ha una libreria, one.dispatch che è un buon punto di partenza. Il wiki ha esempi di utilizzo here

+0

E usa lo stesso concetto di atomo per archiviare tutti i gestori di eventi – Ankur

+0

404 non trovati - lo sai se è stato spostato altrove? –

1

Cambiare un ref/atomo andrebbe bene se si desidera implementare tale soluzione in quanto è quello che fa la maggior parte delle librerie di clojure ecc. Quando hanno tale situazione in cui hanno bisogno di un negozio per archiviare/rimuovere roba in fase di runtime.

2

Dal 2013, il modo migliore per ottenere la gestione degli eventi in clojure è l'eccellente core.async libreria:

core.async consente la programmazione event-driven con canali in un modo abbastanza simile alla lingua Go.