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.

Logo Clojure

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

Comentários