[erlang-questions] On the usage of tests in guards

Richard O'Keefe ok@REDACTED
Tue Mar 3 03:39:09 CET 2009

Recently I was involved in an e-mail argument about whether
it was true that 'when' was a design mistake in Erlang (I
say NO) and whether it was true that most uses of 'when'
could be replaced by type tests inside patterns (I say no,
and even if they could be, they shouldn't be).

It occurred to me to get some numbers to see what other
people were doing, and I ran some fairly crude tools over
the R12B-5 distribution, finding that about 50% of the tests
in guards were _not_ type tests, and that this also seemed
to be true of 'receive' guards.

Wondering whether this would generalise, I just took a look
at the MochiWeb sources.  This looked at all 'when' guards
(not at 'if', sadly, but then, we hadn't been arguing about
'if').  Here's the summary.

  19     is_atom
  26     is_binary
  19     is_integer
   7     is_float
  38     is_list
   3     is_number
   1     is_pid
   6     is_tuple
---     --------
119     Total type tests

  58     =:= (really "member")
   4     =/=
  10     ==
  11     >
  61     >=
  20     <
  48     =<
---     ---------
212     Total comparisons

So comparisons form about 2/3 of the guard tests in MochiWeb,
an even higher proportion than OTP.

A lot of the >= and =< tests were character ranges,
and many of the =:= tests were in guards like
	X =:= c1 ; X =:= c2 ; X =:= c3
checking for specific characters (or occasionally other literals).

More information about the erlang-questions mailing list