Sta ribellando l'idiomatico in clojure?

5

Semplice esempio:

(def ticks 0)
(defn run-iteration []
  (def ticks (inc ticks)))

Anche se il solito caso riguarda cose che non cambiano più di una volta ogni centinaia di ms.

Come farlo in modo idiomatico?

Modifica: e perché il modo idiomatico è idiomatico, e perché è buono?

    
posta amara 06.04.2012 - 22:11
fonte

1 risposta

8

Quello che vuoi veramente è uno dei tipi di riferimento mutabili del clojure, per il tuo esempio, userei un atomo, come questo:

(def ticks (atom 0))
(defn ++ticks []
  (swap! ticks inc))

e per ottenere il valore, @ticks

link

Non usare una def per questo, in effetti l'unico motivo per cui è possibile ridefinire è quello di abilitare lo sviluppo al repl o al hot code che ricarica.

La soluzione di cui sopra è idiomatica in quanto il clojure ha una filosofia di massima immutabilità e mutabilità controllata. Un atomo è la forma più semplice di mutabilità controllata fornita dal clojure. Questa soluzione è pronta per essere utilizzata da più thread ed è appropriata per essere utilizzata da un singolo thread, senza che tu debba pensarci troppo. Questo è il modo clojure.

    
risposta data 06.04.2012 - 22:43
fonte

Leggi altre domande sui tag