30 de dezembro de 2021 • 2 min de leitura
Desestruturação em Clojure
Usando o let
A desestruturação em Clojure usando o let
permite o armazenamento local dentro de uma função. Usar o termo "variável local", não seria de todo correto pois em Clojure todos os dados são imutáveis.
Em Clojure você pode aplicar desestruturação dentro de uma lista através do uso let
.
Um exemplo simples seria:
(def area [200 300]) ; define a symbol "area" that points to a vector [200 300]
(let [[height width] area] (println (* height width)))
; => 60000
Você pode usar o operador &
"rest" para atribuir todo o restante de uma desestruturação em tail
.
(def buzz ["foo" "bar" "zazz" "banana"])
(let [[head & tail] buzz]
(println "head: " head "tail:" tail))
; => head: foo tail: (bar zazz banana)
Podemos usar o operador :as
para atibuir todos os valores a all
(def buzz-words ["foo" "bar" "zazz" "banana"])
(let [[a b :as all] buzz-words]
(println "a" a "b" b "all =>" all))
; => a foo b bar all => [foo bar zazz banana]
Fica mais interessante quando usamos hash-maps. É possível fornecer um valor padrão caso uma chave não exista na estrutura passada com auxílio do :or
.
(def params {:name "aristóteles"})
(let [{name :name hex-color :hex-color :or {name "John Doe" hex-color "#00ff00"}} params]
(println "name:" name "hex-color:" hex-color))
; => name: aristóteles hex-color: 00ff00
Combinando com :as
também é possível obter os parâmetros que foram originalmente passados:
(def params {:name "aristóteles"})
(let [{name :name hex-color :hex-color :as original-params
:or {name name hex-color "#00ff00"}} params]
(println "name:" name "hex-color:" hex-color "original-params:" original-params))
; => name: aristóteles hex-color: #00ff00 original-params: {:name aristóteles}
Usando a desestruturação em mapas aninhados:
(def transaction {:withdraw {:merchant "Casa do Código" :value 29.9 :date "2021-12-30T00:22:00.000-00:00"}})
(let [{{value :value date :date merchant :merchant} :withdraw} transaction]
(println "Compra em" merchant "no valor de" value "em" date))
; => Compra em Casa do Código no valor de 29.9 em 2021-12-30T00:22:00.000-00:00