[erlang-questions] Side-effects in "if" guards
Igor Ribeiro Sucupira
igorrs@REDACTED
Sun May 18 04:06:19 CEST 2008
On Thu, May 15, 2008 at 3:10 PM, Darren New <dnew@REDACTED> wrote:
> Being a newbie to Erlang, I wonder if there's a reason for the "if"
> statement to disallow side-effects in the guards, or whether it's just a
> result of using the same language construct for "if" as for "receive".
> I.e., I understand why guards in "receive" can't have side-effects, but
> the guards in "if" don't really seem to have that same problem.
>
> I often find myself often stumbling over that fact, needing to write a
> nested-three-deep "if" or auxiliary functions to do relatively simple
> (and side-effect-free operations) simply because the tests are too
> complex (calling my own code). For example, I can't say
>
> if X is a list, and the list is length five,
> and there are no duplicates -> good;
>
> I have to
> if X is a list ->
> Y = string:tolower(X),
> if X = Y ->
> if X is length five ->
> V = my:no_duplicates(X),
> if V -> good;
>
> Rather than the more straightforward
> if X is a list andalso string:tolower(X) = X
> andalso len(X) = 5 andalso true = my:noduplicates(X) -> good;
>
> Is there a reason for this other than not having to define (and
> implement) two different kinds of guards?
>
> Or am I doing something suboptimal in my programming by doing this, and
> there's really a clever but unobvious-to-me way of making this work better?
In your example, I would use a case (in fact, I very rarely use ifs):
case is_list(X) andalso string:tolower(X) =:= X andalso length(X) == 5
andalso my:noduplicates(X) of
true -> good;
false -> bad.
Igor.
> --
> Darren New / San Diego, CA, USA (PST)
> "That's pretty. Where's that?"
> "It's the Age of Channelwood."
> "We should go there on vacation some time."
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
>
More information about the erlang-questions
mailing list