[erlang-questions] Code critique please

Zoltan Lajos Kis kiszl@REDACTED
Wed Dec 2 17:58:58 CET 2009


Sam Bobroff wrote:
> 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.
>
>
>
> ________________________________________________________________
> erlang-questions mailing list. See http://www.erlang.org/faq.html
> erlang-questions (at) erlang.org
>
It is there inversed: lists:dropwhile/2

is_subscribed(Dom, SS) ->
  case lists:dropwhile(fun(S) -> not lists:suffix(S, Dom) end, SS) of
    [X|_] -> {true, X};
    [] -> false
  end

Regards,
Zoltan.


More information about the erlang-questions mailing list