On the contrary. I'd like the pin operator regardless of whether rebinding is allowed or not.
def func() do
s = g()
...several lines of code
l = t()
case l do
{s, q} -> #blah
{q,q} -> #blah
{p, r} -> #blah
end
end
Without the "^s", you need context to determine "s"'s behavior. If s is currently unbound, then it'd be assignment. If it's unbound, it'd be pattern matching. It's a rare enough operation that it's nice to make it explicit.
Erlang didn't have rebinding, and Elixir learned from the mistake. Rebinding is not complicated: the scope rules are simple, you learn them and then you're done. It's Day 1 type stuff, which is absolutely not worth optimizing for if you're trying to build a useful language. Without them, you end up coming up with a bunch of bogus variable names that don't add anything to the conversation. Imagine modifying an entry in a struct (or, more exactly, you're making a copy of a struct with one value changed)
With rebinding, it's easy:
def func(dict) do
dict = dict |> Map.put("apple", 1)
end
Without rebinding, you need a pointless new variable name:
def func(dict) do
dict_with_one_apple = dict |> Map.put("apple", 1)
end