Guards and side effects

Luke Gorrie <>
Fri Mar 11 12:44:42 CET 2005


"Ulf Wiger \(AL/EAB\)" <> writes:

> I think it is perfectly reasonable and sound to clearly
> differentiate between functions that modify data (and perhaps
> produce side-effects) and expressions that test the validity
> of data in a side-effect free manner.

I'm with you, I like guards the way they are.

I think the main issue is that guards look so nice:

  foo(X) when guard1(X) -> code1;
  foo(X) when guard2(X) -> code2;
  ...

but if you need a non-guard test then it's way more verbose:

    foo(X) ->
        case test1(X) of
            true ->
                code1;
            false ->
                case test2(X) of
                    true ->
                        code2;
                    false ->
                        ...
                end
        end

Seems a bit unnecessary.

The related and bigger problem for me is code like:

    case foo() of
        {ok, F} ->
            case bar() of
                {ok, B} ->
                    ... ;
                Err = {error, Reason} ->
                    Err
            end;
        Err = {error, Reason} ->
            Err
    end

I'm looking forward to trying out the new try-catch on this code once
we manage to upgrade to R10.

Cheers,
Luke





More information about the erlang-questions mailing list