[erlang-questions] How to make a short circuit in erlang ?

Richard A. O'Keefe <>
Tue Mar 26 03:50:30 CET 2013


On 26/03/2013, at 3:31 PM, 饕餮 wrote:

> When in other language.We can use like:
> example(Something){
>     if( Something == false)
>         return;
>     //do something here;
> }

Brian Marick of www.exampler.com has two great stickers.
One I have fixed to my door is "To be less wrong than yesterday."
The other is "An example would be useful about now" (from memory).

Even in C and Java, "if (Something == false)" is bad style.
You should write "if (!Something)".  The only time that
==false or ==true make sense is when there is a third possibility.


> But in Erlang.I have to write like:
> example(Something) ->
>     if
>         Something == false ->
>             false;
>         true ->
>             %do something here
>     end.

I personally prefer

    example(Something) ->
        case Something
          of false -> false
           ; true  -> . . .
        end.

and then go looking for the third case that probably exists.
There is pattern matching in the head.
There are guards to be used.
In fact, "early-exit" (as it's known in the Smalltalk world)
is often an ersatz for guard tests.

So the chances are that you should either
 - be rewriting for clarity, or
 - using guards.

I think a *real* example would be illuminating.
> 
> That's could make the multiple nested like:
> example(Something) ->
>     if
>         Something == false ->
>             false;
>         true ->
>             if
>                 Otherthing == false ->
>                     false
>                 true ->
>                     %do something here
>     end.
> 
> Some code could make 5 or more nested in it.

No.  SHOW US A REAL EXAMPLE.  And nothing stops you writing

example(Foo, Bar, Ugh) ->
    case {Foo, Bar, Ugh}
      of {false, _, _} -> . . .
       ; {true, false, _} -> . . .
       ; {true, true, false} -> . . .
       ; {true, true, true} -> . . .
    end.

We need a real example.  (Did I already say that?)

> Is there any idea to make short circuit to reduce of the nested?

Give us a real example and *then* we can have an illuminating
discussion.

It's a funny thing.  I use early exit a lot in Smalltalk, rather
less so in C, and in ML and Haskell it never occurs to me that I
don't actually have it.  Erlang is definitely close to the ML end
of things.

I just spent a day turning 63 SLOC of code I wanted to use for a
class example of the importance of comments into 21 lines, which
annoyingly needs a lot fewer comments.  Part of it was to not be
scared of introducing auxiliary functions (in Java, yet!).





More information about the erlang-questions mailing list