[erlang-questions] list:join() for erlang?
Bjorn Gustavsson
bjorn@REDACTED
Fri Sep 14 11:29:58 CEST 2007
I haven't profiled it, but the code seems fine to me.
"Bob Ippolito" <bob@REDACTED> writes:
> > Looks like you're right. Here's my tail-recursive version of the same:
> >
> > join([], _) -> [];
> > join([S1 | S_Rest], Sep) ->
> > S1 ++ reverse_join(lists:reverse(S_Rest), Sep, []).
This call is body-recursive, which means that that '++' is evaluated from
right to left. This use of '++' is fine.
> > reverse_join([], _, Joined) -> Joined;
> > reverse_join([S1 | S_Rest], Sep, Joined) ->
> > reverse_join(S_Rest, Sep, Sep ++ S1 ++ Joined).
This usage of '++' is also OK, since the growing result is on the right
side.
> Using ++ all over the place is probably a bad idea, at least according
> to the performance guide and my intuition. I haven't profiled it.
The Efficiency Guide could be a little bit clearer about '++'. We will probably
update it in the R12B release.
'++' is not always bad. It is bad if you build a result on the left-hand side of '++',
because the result that is growing will be copied again and again. It is fine if the
result is on the right-hand side, because the right-hand side is not copied.
/Bjorn
--
Björn Gustavsson, Erlang/OTP, Ericsson AB
More information about the erlang-questions
mailing list