triple simple luz interruptores interruptor instalar instalacion doble cruce conmutados conmutador conmutada conmutaciĆ³n conmutacion conectar como clojure

clojure - simple - ref-set vs conmutar vs alterar



interruptor de conmutacion triple (1)

¿Cuál es la diferencia en las 3 formas de establecer el valor de una referencia en Clojure? He leído los documentos varias veces sobre ref-set, conmutar y modificar. Estoy bastante confundido cuáles usar en qué momentos. ¿Puede alguien darme una breve descripción de cuáles son las diferencias y por qué se necesita cada una?


Como una explicación súper simple de cómo funciona el sistema de memoria transaccional de software en clojure; reintenta transacciones hasta que todos puedan pasar sin que se modifiquen sus valores. Puede ayudarlo a tomar esta decisión utilizando ref-changing-functions que le dan pistas sobre qué interacciones son seguras entre las transacciones.

  • ref-set es para cuando no te importa el valor actual. ¡Solo prepáralo para esto ! ref-set te ahorra la angustia de escribir algo como (alter my-ref (fun [_] 4)) solo para establecer el valor de my-ref en 4. (ref-set my-ref 4) seguro se ve mucho mejor :).
    Use ref-set para simplemente establecer el valor.

  • alter es el estándar más normal. Use esta función para alterar el valor. Esta es la carne del STM. Utiliza la función que pasa para cambiar el valor y vuelve a intentar si no puede garantizar que el valor no se modificó desde el inicio de la transacción. Esto es muy seguro, incluso en algunos casos en los que no necesita que sea tan seguro, como incrementar un contador. Probablemente quiera usar alter mayor parte del tiempo.

  • commute es una versión optimizada de alter para aquellos tiempos en los que el orden de las cosas realmente no importa. no importa quién haya agregado qué +1 al contador. El resultado es el mismo. Si el STM está decidiendo si su transacción es segura para comprometerse y solo tiene conflictos en las operaciones de conmutación y ninguna en las operaciones de modificación, entonces puede continuar y comprometer los nuevos valores sin tener que reiniciar a nadie. Esto puede ahorrar el intento de reinicio de transacciones ocasionales, aunque no verá grandes ganancias de esto en el código normal.
    Usa el commute cuando puedas.