[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