That’s a good way to think of it, like OCaml has 3 syntax’s for this:
(* This creates a new immutable binding *)
let a = 42
(* `a` cannot be changed, only re-bound like how Elixir does it *)
(* This creates a new mutable binding *)
let b = ref 42
(* It can be changed within its scope *)
let () = b := 21
(* The `:=` operator means `to change where the binding points to` in a sense,
It returns empty tuple, so you can pattern match that as above, or ignore it.
It is indeed made purposefully cumbersome to minimize its use. *)


















