[erlang-questions] The If expression

Richard O'Keefe <>
Mon Jan 26 04:50:13 CET 2009


On 24 Jan 2009, at 11:35 am, Fredrik Svahn wrote:
>> - 'if' isn't actually all that rare.  In some code I wrote last
>> year, I find one 'if' for every four 'case's.  The OTP sources
>> have 1 if/10 case, which is less common, but not _that_ rare.
>> If the old sense of 'if' were rare, we could probably live with
>> the confusion.
>
> Newcomers to this mailing list asking how to use "if" are invariably
> recommended to use "case" instead. Combined with the fact that you can
> only use guards it is almost FAQ material. Considering this and all
> the beating the 'if' expression has gotten over the years on the
> mailing list my assumption was that the use of 'if' was really rather
> infrequent even outside of OTP. I might be wrong.
>
> (Hmmm, I just checked, and there actually is a chapter about 'if':s in
> the FAQ. It is recommending the use of 'case' and even states that
> "case is used much more frequently").

Ten to one *is* "much more frequently".
However, one in ten is not a negligible proportion.

> Just out of curiosity, is there any other programming language out
> there which has an 'if' and which does not have an 'else' apart from
> the Commodore 64 BASIC? I am not saying Erlang should have because
> everyone else does. I am just wondering out of curiosity.

Dijkstra's notation, Promela, classic Lisp (to this day, if you want
an "else" in a COND, you have to use the equivalent of "; true ->"),
Occam.

- As a result the new syntax is rather inconvenient.  The majority
>
>>  of my existing uses of 'if' have more than one arm, so would need
>>  nested new-'if's.  It's hard to see that as an improvement.
>
> The proposal is backwards compatible (with the obvious exception that
> 'else' would need to become a keyword) so there is no need for you to
> change your coding style.

That much was obvious.  My point is that common things like
	if X < Y -> a()
	 ; X > Y -> b()
	 ; X ==Y -> c()
	end
have to be rewritten as
	if X < Y -> a()
	else
	   if Y > Y -> b()
	   else
	      c()
	   end
	end
so there isn't much *point* in changing coding style either.
>
> There is a lot of code out there to critically review, then.

Yes, there is.  In fact, looking for 'true' and 'false' is a good
way to find code that could be clearer.

> In fact
> 'true' is the second most popular atom in the OTP code, and 'false' is
> the fourth most popular.

No dispute there.  Oh, that it were not so!
>
> What else can it really be used for? Ok, there are a couple of guard
> bifs, but that is basically it, isn't it?

Type tests.



More information about the erlang-questions mailing list