8.14 Short-Circuit Expressions

Expr1 orelse Expr2Expr1 andalso Expr2

Expr2 is evaluated only if necessary. That is, Expr2 is evaluated only if:

• Expr1 evaluates to false in an orelse expression.

or

• Expr1 evaluates to true in an andalso expression.

Returns either the value of Expr1 (that is, true or false) or the value of Expr2 (if Expr2 is evaluated).

Example 1:

case A >= -1.0 andalso math:sqrt(A+1) > B of

This works even if A is less than -1.0, since in that case, math:sqrt/1 is never evaluated.

Example 2:

OnlyOne = is_atom(L) orelse         (is_list(L) andalso length(L) == 1),

From Erlang/OTP R13A, Expr2 is no longer required to evaluate to a Boolean value. As a consequence, andalso and orelse are now tail-recursive. For instance, the following function is tail-recursive in Erlang/OTP R13A and later:

all(Pred, [Hd|Tail]) ->    Pred(Hd) andalso all(Pred, Tail);all(_, []) ->    true.