Enhanced type guard syntax]

Ulf Wiger (ÄL2/EAB) ulf.wiger@REDACTED
Thu Sep 18 17:12:38 CEST 2003


On Sept 18 2003, Joe Armstrong <joe@REDACTED> wrote:
>
>  Adding  guards  like  this   violates  one  of  my  favorite  design
>meta-principles:
>
>  " If  you add something  to a language  you have to  chuck something
>away "
>
>  What are we going to chuck away?
>
>  Well not "when ->" ...
>
>  Since you can't say
>
>	foo(X, Y) when X == 2*Y ->
>
>  in the new syntax
>
>
>  Adding the new syntax without removing something will *increase* the
>complexity of the language. Since the change adds no semantic power
>I am against it.

In principle, I agree. However, one big problem with the 'when... ->'
syntax is that it's exceedingly ugly (well, at least exceedingly
cumbersome.)

The following code snippet from wings_deform.erl:

twist_fun(y, {Cx,_,Cz}) ->
    fun(U, Min, {X0,Y,Z0})
       when float(U), float(Min), float(X0), float(Y), float(Z0) ->
	    Angle = U*(Y-Min),
	    Cos = math:cos(Angle),
	    Sin = math:sin(Angle),
	    X = X0 - Cx,
	    Z = Z0 - Cz,
	    {X*Cos+Z*Sin+Cx,Y,Z*Cos-X*Sin+Cz}
    end;

would be possible to write as:

twist_fun(y, {Cx,_,Cz}) ->
    fun(U/float, Min/float, {X0/float, Y/float, Z0/float}) ->
        Angle = U*(Y-Min),
        Cos = math:cos(Angle),
        Sin = math:sin(Angle),
        X = X0 - Cx,
        Z = Z0 - Cz
        {X*Cos+Z*Sin+Cx,Y,Z*Cos-X*Sin+Cz}
    end;

which I personally think is a significant face lift.
Note for example that the complete function head in the 
second version is shorter than the guard declaration alone
in the first version. That, and the first version forces the
reader to jump back and forth in order to match the guards 
with the arguments.

In this particular code (I believe), type guards are important
from a performance perspective, since floating point operations
are performed more efficiently if the compiler can _know_ that
the input parameters are really floats.

In general, type guards should be used more because they add
safety and clarity. Unfortunately, with today's guard syntax,
they are unnecessarily clumsy, and can actually serve to 
obfuscate the code rather than clarifying it.

Also, it's consistent with the bit syntax, so the X/Type
syntax has already been added to the language.

For these reasons, I support the proposal.

/Uffe



More information about the erlang-questions mailing list