Old style vs. new style boolean expressions

James Hague jamesh@REDACTED
Tue Oct 8 17:50:41 CEST 2002

Here is a function written in classic Erlang style:

is_alphanum(N) when N >= $A, N =< $Z -> true;
is_alphanum(N) when N >= $a, N =< $z -> true;
is_alphanum(N) when N >= $0, N =< $9 -> true;
is_alphanum($_) -> true;
is_alphanum(_) -> false.

This can also be written using boolean expression guards, which were
introduced in (I think) R8:

is_alphanum(N) ->
	((N >= $A) and (N =< $Z)) or
	((N >= $a) and (N =< $z)) or
	((N >= $0) and (N =< $9)) or
	(N == $_).

This isn't as efficient as the first method, because the boolean expression
in the second code snippet is always fully evaluated.  To fix this, use
"andalso" and "orelse":

is_alphanum(N) ->
	((N >= $A) andalso (N =< $Z)) orelse
	((N >= $a) andalso (N =< $z)) orelse
	((N >= $0) andalso (N =< $9)) orelse
	(N == $_).

Now the point:  The first vesion generates by far the smallest beam file,
the second is somewhat larger, and the third is still larger.  When fiddling
with a module containing many similar functions, switching from first to the
third method increased the beam file size by 40%.

Is this just because boolean expressions are a relatively new addition, and
so the R8 compiler doesn't deal with them well, or is it deeper than that?

I'm still not sure whether I think the first or third method is cleaner :)

More information about the erlang-questions mailing list