2010-06-17 15 views
5

Tengo un número de átomos en mi código donde un requisito común es actualizarlos a un nuevo valor, independientemente del valor actual.Actualizar un átomo con un único valor

por lo tanto, me encuentro escribiendo algo como esto:

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

Esto funciona, pero parece bastante feo y, presumiblemente, incurre en una penalización de rendimiento para la construcción del cierre anónimo.

¿Hay una manera mejor?

Respuesta

8

La función reset! debería hacer esto.

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

impresionante ... ¡exactamente lo que estaba buscando! – mikera

1

Puede usar (comparar y establecer valores antiguos de valor-nuevo de átomo).

Pero me parece extraño que tenga que cambiarlos tanto a valores no correlacionados. ¿No puedes usar enlaces o cosas similares?

+0

Es para administrar una unidad de estado concurrente compartido a través de subprocesos para que los enlaces no funcionen. Los átomos de AFAICS parecen ser la forma estándar de hacer esto ... – mikera

+0

Cierto, pero me preocupa la semántica de una variable global que a menudo cambia a un valor que no se puede transformar desde el valor anterior. Con un enlace, realiza una instantánea del estado "compartido" hasta que se abandona el alcance de captura nuevamente. Si esto no es aceptable, entonces debe haber dependencias de tiempo entre hilos y un tipo de comunicación entre hilos a través del átomo. No he encontrado un caso de uso como este, por lo general solo tengo cosas como configuración, agregaciones o sesiones/cachés en átomos. –

+0

Ejemplo: temporizadores en una simulación. Diferentes hilos pueden necesitar leer la última marca de tiempo global, solo un hilo lo actualiza. La actualización es independiente del valor anterior. – mikera

Cuestiones relacionadas