[erlang-questions] How about a new warning? Was: Re: trouble with erlang or erlang is a ghetto

Jeff Schultz jws@REDACTED
Fri Aug 5 04:22:14 CEST 2011

On Wed, Aug 03, 2011 at 11:47:13PM +0200, Richard Carlsson wrote:
>> According to the Barklund spec (page 62), it said that "a compiler
>> must only accept a program if for any evaluation order, there will
>> not be an applied occurrence of an unbound variable".
>> "For example, in a context where X is unbound, the expression (X=8) +
>> X should give a compile-time error."
>> (And it does, too. I checked).

Thanks for pointing that out.  I'd have missed that one.

> An interesting twist on the example (X=8) + X is that if *both* arguments 
> create a binding of the same variable, as in:
>   (X=8) + (X=8)
> then Erlang will first evaluate the subexpressions, then *check* that the 
> results match so that a single agreed value of X can be exported out from 
> the whole expression, and only in that case will it call + on the results. 
> You can experiment with the following to see what I mean:

The difference between the two cases seems a bit weird to me.  I would
have expected that the meaning of a call f(Expr1, Expr2) (I'll write
it as |f(Expr1, Expr2)|) where the Expr are other Erlang expressions
should be exactly the same as

    |T1 = Expr1|,
    |T2 = Expr2|,
    f(T1, T2)

where the T are new variables and |.| is applied recursively.

In this case, |(X = 8) + X| means X = 8, T1 = X, T2 = X, T1 + T2,
which is okay, and |X + (X = 8)| means T1 = X, X = 8, T2 = X, T1 + T2,
which is a compile-time error.

While I appreciate the intent of Barklund's rule above, I don't think
it plays well with Erlang's explicit left-to-right order of

Erlang really could do with a concise, agreed, current specification,
preferrably executable.

    Jeff Schultz

More information about the erlang-questions mailing list