In Erlang You are allowed to bind a variable only once. There is no chance to use the same variable even as an accumulator. Let's look at the code:
Price = Catalog.lookup( Item)
Price2 = Price * Quantity
Price3 = Price2 + Price2 * Tax
Not perfect one in terms of readability. Right?
Let's look at its Elixir counterpart:
price = Catalog.lookup(item)
price = price * quantity
price = price + price * tax
Does It look like Elixir is mutable? But only from the first sight and reall it's not.
Under the hood, the compiler is implicitly doing kind of what the original Erlang program does. The result is that, there’s no mutable state internally at all.
Here is a little prove on concept. Let's introduce price_at_the_beginning variable and make sure it does not equal to the price at the end:
price = Catalog.lookup(item)
price_at_the_beginning = price
price = price * quantity
price = price + price * tax
inspect {price, price_at_the_beginning}