Destructuring

Destructuring is a way to bind names to values inside a data structure. Destructuring works for function parameters, let and loop bindings.

Sequential data structures can be extract using the tuple syntax.

(let [[a b] [1 2]]
  (+ a b)) # Evaluates to 3

(let [[a [b c]] [1 [2 3]]]
  (+ a b c)) # Evaluates to 6

(let [[a _ b] [1 2 3]]
  (+ a b)) # Evaluates to 4

(let [[a b & rest] [1 2 3 4]]
  (apply + a b rest)) # Evaluates to 10

Associative data structures can be extracted using the table syntax.

(let [@{:a a :b b} @{:a 1 :b 2}]
  (+ a b)) # Evaluates to 3

(let [@{:a [a b] :c c} @{:a [1 2] :c 3}]
  (+ a b c)) # Evaluates to 6

Indexed sequential can also be extracted by indices using a special array syntax.

(let [@[0 a 1 b] @[1 2]]
  (+ a b)) # Evaluates to 3

(let [@[0 [a b] 1 c] @[[1 2] 3]]
  (+ a b c)) # Evaluates to 6