typestar

Átomos y swap! en Clojure

Lleva en átomos el conteo de visitas y el registro de recepción, y actualiza los dos con funciones comunes.

;; An atom holds one value that is allowed to change over time.
;; swap! applies a function to the current value and stores the
;; result, so the update stays a plain function call.
(def visitors (atom 0))

(swap! visitors inc)
(swap! visitors + 10)
(println (format "visitors %d" @visitors))

;; @ is deref: it reads the value in place without changing it.
(def register (atom {:desk "Ida" :guests []}))
(swap! register update :guests conj "Perez")
(swap! register update :guests conj "Okoye")
(println (format "%s logged %d" (:desk @register)
                 (count (:guests @register))))

;; reset! replaces the value outright instead of deriving a new one.
(reset! visitors 0)
(println (format "visitors %d" @visitors))

Cómo funciona

  1. (swap! visitors inc) y (swap! visitors + 10): swap! pasa el valor actual a una función y los extras van detrás.
  2. (swap! register update :guests conj "Perez") rehace un mapa anidado: la función puede devolver cualquier valor.
  3. @visitors es deref: lee el átomo, y (reset! visitors 0) reemplaza el valor en vez de derivarlo.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
19
Caracteres a escribir
707
Tokens
97
Ritmo de tres estrellas
70 tpm

Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 83 segundos.

Escribe este fragmento

Paso 1 de 3 en Estado y records; paso 22 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →