[erlang-questions] A matter of style?

Björn Gustavsson bgustavsson@REDACTED
Sat Aug 14 09:18:57 CEST 2010


On Fri, Aug 13, 2010 at 5:11 PM, Iñaki Garay <igarai@REDACTED> wrote:
> within(X, Y, Z, Xmin, Ymin, Zmin, Xmax, Ymax, Zmax) ->
>    (Xmin =< X) and
>    (X =< Xmax) and
>    (Ymin =< Y) and
>    (Y =< Ymax) and
>    (Zmin =< Z) and
>    (Z =< Zmax).

Written like this, all conditions will be evaluated every time,
even if a condition has evaluated to false.

To ensure that the function returns false as soon as one
condition evaluates to false, rewrite it like this:

within(X, Y, Z, Xmin, Ymin, Zmin, Xmax, Ymax, Zmax) ->
   Xmin =< X andalso
   X =< Xmax andalso
   Ymin =< Y andalso
   Y =< Ymax andalso
   Zmin =< Z andalso
   Z =< Zmax.

Alternately, it can be written like this:

within(X, Y, Z, Xmin, Ymin, Zmin, Xmax, Ymax, Zmax) when
Xmin =< X, X =< Xmax, Ymin =< Y,
Y =< Ymax, Zmin =< Z, Z =< Zmax ->
    true;
within(_, _, _, _, _, _, _, _, _) ->
    false.

In general, boolean expressions in guards will
be short-circuited unless that would break
the semantics. For instance, in this function

f(A, B) when (length(A) > 5) or (length(B) > 10) ->
    ok.

both length(A) and length(B) will always be
evaluated.

-- 
Björn Gustavsson, Erlang/OTP, Ericsson AB


More information about the erlang-questions mailing list