[erlang-questions] Code critique please

Sam Bobroff <>
Wed Dec 2 17:41:21 CET 2009


Jarrod Roberson wrote:
> is there anything that I can do to improve this code? Are the nested case of
> the best way to do that? It was the only thing I could get to work.
>   
Hi Jarrod,

I have another suggestion you might find interesting. I would like to 
factor out the recursion in the "is_subscribed" function because I think 
it's generally good to use comprehensions or folds if you can, instead 
of creating your own recursion. Unfortunately I can't see a way to do 
this trivially, so:

Given this code:
> % test to see if a dns_rr.domain is subscribed to
> is_subscribed(_,[]) -> false;
> is_subscribed(Dom,[S|Rest]) ->
>     case lists:suffix(S,Dom) of
>         true ->
>             {ok,S};
>         false ->
>             is_subscribed(Dom,Rest)
>     end.
I would first write a function like this:

%% first(Pred, List): Return either false or {true, Elem} where Elem is 
the first element of List for which Pred(Elem) returns true.
%% Pred must take one argument and return true or false.
first(Pred, []) ->
    false;
first(Pred, [X | Xs]) ->
    case Pred(X) of
        true ->
            {true, X};
        false ->
            first(Pred, Xs)
    end.

Then I could write is_subscribed like this:

is_subscribed(Dom, SS) ->
    first(fun(S) -> lists:suffix(S, Dom) end, SS).

This makes the "is_subscribed" function really easy to understand and 
provides "first" as a useful tool.

To be honest I was quite surprised that it wasn't in the "lists" 
module... maybe there is one somewhere I couldn't find.

Sam.




More information about the erlang-questions mailing list