4 ms·
Your last paragraph show you have the right hunch. Erlang has a pretty simple binding compared to, say, ML. In the statement X = Expr, Body Evaluates Expr, b
by jlouis 18y ago
Your last paragraph show you have the right hunch.
Erlang has a pretty simple binding compared to, say, ML. In the statement
X = Expr,
Body
Evaluates Expr, binds it to X and evaluates the body with X bound. This is akin to variants of let-bindings found in so many other languages. The difference is, however, that the binding can not be shadowed. If body contains, say:
X = Expr2,
it is taken as an assertion: Evaluate Expr2 and compare it to X, crashing the program if Expr2 is not equal to (in effect) Expr. What some miss is that this is not mutation, but binding. In
X = 0,
F = fun (Y) -> Y + X end,
X = 1,
F(4).
The X inside the body of F is bound to 0 and not 1 when F gets evaluated because any semantics apart from this would be silly in a functional language with lexical scope. And since Erlang has no concept of Let-bound scopes in functions it would probably give some of the problems you mention.
I guess the Prolog-history plays a part in the decision, but also the fact that explicit (single) assignment is a really good tool for weeding out bugs: Any use will explicitly refer to exactly one def. Several compilers that allow shadowing of let-scopes even go as far as including a warning when you shadow variables!