2010-06-17 14 views
5

Ich habe eine Anzahl von Atomen in meinem Code, wo eine allgemeine Anforderung darin besteht, sie auf einen neuen Wert zu aktualisieren, unabhängig vom aktuellen Wert.Aktualisieren eines Atoms mit einem einzelnen Wert

ich mich deshalb findet so etwas wie diese schreiben:

(swap! atom-name (fn [_] (identity new-value))) 

Das funktioniert aber scheint ziemlich hässlich und vermutlich eine Leistungseinbuße verursacht die anonyme Schließung für die Konstruktion.

Gibt es einen besseren Weg?

Antwort

8

Die Funktion reset! sollte dies tun.

(reset! atom-name new-value) 
+0

genial ... genau das, was ich gesucht habe! – mikera

1

Sie können (vergleichen-und-set atom old-value new-value) verwenden.

Aber ich finde es seltsam, dass Sie sie so sehr zu unkorrelierten Werten ändern müssen. Kannst du Bindings oder ähnliche Dinge nicht benutzen?

+0

Es ist für die Verwaltung einer Einheit des gemeinsamen konkurrierenden Status über Threads hinweg, so dass Bindungen nicht funktionieren würden. AFAICS-Atome scheinen die Standardmethode dafür zu sein. – mikera

+0

Stimmt, aber ich mache mir Sorgen um die Semantik einer globalen Variablen, die sich oft zu einem Wert ändert, der nicht vom vorherigen Wert transformiert werden kann. Mit einer Bindung machen Sie eine Momentaufnahme des Status "shared", bis der Erfassungsbereich wieder verlassen wird. Wenn dies nicht akzeptabel ist, müssen zeitgebundene Abhängigkeiten zwischen Threads und einer Art von Inter-Thread-Kommunikation durch das Atom bestehen. Ich bin nicht über einen Anwendungsfall wie diesen gekommen, ich habe normalerweise nur Dinge wie Konfiguration, Aggregationen oder Sitzungen/Caches in Atomen. –

+0

Beispiel: Timer in einer Simulation. Verschiedene Threads müssen möglicherweise den neuesten globalen Zeitstempel lesen, der nur von einem Thread aktualisiert wird. Update ist unabhängig vom vorherigen Wert. – mikera

Verwandte Themen