[erlang-questions] guard expression restriction

Jeff Schultz <>
Fri Dec 3 03:44:33 CET 2010


On Thu, Dec 02, 2010 at 10:37:55AM +0200, Kostis Sagonas wrote:
> Hmmm... In any case, the paper I mentioned in my previous mail contains an 
> example of more clear and succinct code when user-defined guards are 
> allowed.

I'm pretty sure I wouldn't write your Figure 7 that way in anything
other than short-lived code that I planned to throw away.*

Transcribed, it's more or less

    foo2(Set) when gb_sets:is_set(Set) ->
	handlegbset(Set);
    foo2(Set) when sets:is_set(Set) ->
	handleset(Set);
    foo2(_) ->
	error.

This puts my code at the mercy of data-representation changes in
either referenced module that I have no control over.  (In fact,
gb_sets:is_set is explicitly "Not Recommended" in its documentation.)

I'd be much more likely to write something like

    -record(agg, {kind=error, set=error}).

    % Code to generate various kinds of #agg and pack them correctly
    % into the record . . . .

    foo3(Agg) when Agg#agg.kind =:= gb_set ->
        handlegbset(Agg);
    foo3(Agg) when Agg#agg.kind =:= set ->
	handleset(Agg);
    foo3(_) ->
	error.

I can maintain this, and I'm safe from changes in someone else's
datastructures that might make one kind of collection look like
another.


    Jeff Schultz


-----------------------------------------------------
*Of course, it's often the code you were most certain
to throw away that lives the longest :-(


More information about the erlang-questions mailing list