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

饕餮 249505968@REDACTED
Tue Mar 26 04:24:31 CET 2013


hmmmmm
Something I just don't agree.
I use Something == false. 
Because I do not name the variable like Is_Something_Right (Apologize for my mike).
!Is_Something_Right could be a better code style.
!Something , in my opinion, is not better than Something == false.


I have see this code style in my project as you write.
example(Foo, Bar, Ugh) ->
    case {Foo, Bar, Ugh}
      of {false, _, _} -> . . .
       ; {true, false, _} -> . . .
       ; {true, true, false} -> . . .
       ; {true, true, true} -> . . .
    end. 
But when look at the {true,true,false}.
I still need to check which one is true , and which is false (I'm just stupid as a duck).
And There could be 8 different status.
That means I should write 8 entry for 3 judgement
But if three are nest(Although I don't like it).Only need 3 entry. 
So I don't think this a good coding style.


I just wonder is there any way like return in other language could just return and ignore the step below.
And Now I know there are no way to do like that.
More function could be a good choice I think


------------------ 原始邮件 ------------------
发件人: "Richard A. O'Keefe"<ok@REDACTED>;
发送时间: 2013年3月26日(星期二) 上午10:50
收件人: "饕餮"<249505968@REDACTED>; 
抄送: "erlang-questions"<erlang-questions@REDACTED>; 
主题: Re: [erlang-questions] How to make a short circuit in erlang ?




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!).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20130326/79d428da/attachment.htm>


More information about the erlang-questions mailing list