Skip to content

Latest commit

 

History

History
53 lines (37 loc) · 2.19 KB

File metadata and controls

53 lines (37 loc) · 2.19 KB

Anotações do dia 02-02-2021

Trabalhando com valores mutaveis em clojure, para isso vamos utilizar atom que é uma das formas de manipular o estado de um simbolo, imagine que o atom cria uma camada em cima do seu objeto e essa camada é mutavel, portanto permite que você faça alterações.

O primeiro passo vamos criar uma fila com o nome de agenda, e apos usar a função atom:

(def ^:private agenda (atom {:compromissos h.model/nova_fila}))

Entender esse conceito do atom pode parecer complexo, porque até agora estavamos lidando com coleções imutaveis, então recomendo ler a doc do clojure sobre esse tópico, assim como os demais citados nas anotações: https://clojuredocs.org/clojure.core/atom

No exemplo vamos utilizar a função adicionar-compromisso que será responsável por criar novos itens na nossa fila.

Para "forçar" que essa fila seja mutavel vamos utilizar o swap! normalmente as funções que permitem que simbolos se tornem mutaveis utilizam o sinal de exclamação no final da palavra reservada

E a sintaxe ficará da seguinte forma:

(swap! [nome fila atomica] [funcao que sera aplicada] [hashmap] [elemento]))

Vamos ao exemplo:

(ns exemplo.core
  (:use [clojure pprint])
  (:require [exemplo.model :as h.model]))

(def ^:private agenda (atom {:compromissos h.model/nova_fila}))

(defn adicionar-compromisso [item]
  (swap! agenda update :compromissos conj item))

(let [compromissos ["Dentista" "Vacinar contra Covid" "Palestrar na TDC 2021" "Escrever artigo sobre Threads no Clojure"]]
    (pprint(map adicionar-compromisso compromissos)))

Nesse exemplo definimos agenda como um simbolo global porém privado para ser utilizado somente nesse namespace.

Criamos a função adiciona-compromisso que tem a responsabilidade de adicionar itens a nossa agenda na qual é feito o update da agenda.

Output:

({:compromissos <-("Dentista")-<}
 {:compromissos <-("Dentista" "Vacinar contra Covid")-<}
 {:compromissos
  <-("Dentista" "Vacinar contra Covid" "Palestrar na TDC 2021")-<}
 {:compromissos
  <-("Dentista"
     "Vacinar contra Covid"
     "Palestrar na TDC 2021"
     "Escrever artigo sobre Threads no Clojure")-<})