- Função loop pode ser utilizada para executar um laço de repetição, entretanto acredito que ela não devesse ser utilizada sendo que existe a possibilidade de você utilizar recursão como expliquei na anotação do dia 24.01.2021.
Entretanto pode existir casos que seja necessário o uso do loop, então segue um exemplo de como utiliza-lo, vamos utilizar o exemplo da função conta-numero-elementos:
A sintaxe do "loop" lembra um pouco a do "for" quando você utiliza linguagens orientada a objeto.
(defn conta-numero-elementos
([elementos])
(loop [total-ate-agora 0
elementos-restantes elementos]
(if (seq elementos-restantes)
(recur (inc total-ate-agora) (next elementos-restantes))
total-ate-agora)))
o "recur" nesse exemplo está sendo utilizado para retornar ao "loop" e executar esse bloco, a partir do "if" novamente , caso eu tivesse alguma função antes do loop ela não é executada mais de uma vez, porque está antes, se você tiver mais codigo antes do loop o nivel de complexidade ciclomatica da sua função começa a aumentar nesse caso, talvez seja necessário uma refatoração pois a sua função está com mais responsabilidade do que deveria, indo contra um dos dogmas das boas praticas de desenvolvimento de software que é single responsability.
Bom, continuando os estudos em clojure aprendi mais algumas coisas legais relacionadas a coleção:
Para isso vamos precisar de dados para fazer essa manipulação, considere criar um arquivo chamado bancodedados.clj e inserir os dados abaixo, basicamente criei três objetos para representar feriados:
(ns loja.exemplo.bancodedados)
(use 'java-time)
(def feriado1 {:id (.toString (java.util.UUID/randomUUID))
:nome "aniversario de sp"
:data-feriado (local-date-time 2021 1 25)
})
(def feriado2 {:id (.toString (java.util.UUID/randomUUID))
:nome "Natal"
:data-feriado (local-date-time 2021 12 25)
})
(def feriado3 {:id (.toString (java.util.UUID/randomUUID))
:nome "Natal-2"
:data-feriado (local-date-time 2021 12 25)
})
(defn feriados-2021 []
[feriado1, feriado2,feriado3])
- Função "group-by" é utilizada para realizar agrupamentos a partir de um determinado indicador, no exemplo abaixo vamos utilizar o campo data-feriado para realizar o agrupamento, portanto a função "group-by" receberá dois argumentos uma função que será responsavel por dizer qual campo deve ser utilizado para agrupar (
agrupamento-por-data
) e a nossa coleção (l.db/feriados-2021
).
O output será as coleções agrupadas dentro de um vetor pelo indicar que nesse caso é o campo data-feriado
.
(ns exemplo.exemplo25012021
(:require [exemplo.bancodedados :as l.db]))
(defn agrupamento-por-data
[elemento]
(:data-feriado elemento))
(println (group-by agrupamento-por-data (l.db/feriados-2021)))
{
#object[java.time.LocalDateTime 0x1fb91a30 2021-01-25T00:00]
[
{
:id 993a0f9c-912a-42d4-bb12-6e64311ec4f4,
:nome aniversario de sp,
:data-feriado #object[java.time.LocalDateTime 0x1fb91a30 2021-01-25T00:00]
}
],
#object[java.time.LocalDateTime 0x1a3872ee 2021-12-25T00:00]
[
{
:id d0734804-4f9d-40dc-949e-4290e0cd0499,
:nome Natal,
:data-feriado #object[java.time.LocalDateTime 0x1a3872ee 2021-12-25T00:00]
}
{
:id 7537d5bf-0d4c-47ff-a960-6fd346cac333,
:nome Natal-2,
:data-feriado #object[java.time.LocalDateTime 0x7dbfc257 2021-12-25T00:00]
}
]
}
Para gerar a data utilizei uma biblioteca chamada Clojure.Java-Time ela funciona como um wrapper para Java 8 Date-Time API, escolhi essa lib porque ela é simples de utilizar, tem poucas issues e está sendo mantida pela comunidade o ultimo era a cerca de 4 meses.
O primeiro passo para utiliza-la é referenciar no seu projeto.clj:
[clojure.java-time "0.3.2"]
e após utilizar o use no arquivo que você for utiliza-lo, dessa forma: (use 'java-time)
a função que utilizei para preencher o campo data-feriado foi a local-date-time
basicamente ela pode receber como argumento o [ano-mes-dia]
ficando dessa forma:
(local-date-time 2021 12 25)