[erlang-questions] list:join() for erlang?
Paulo Sérgio Almeida
Fri Sep 14 12:39:44 CEST 2007
Bjorn Gustavsson wrote:
> 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.
This insight is important for people to start using ++ more frequently.
Regarding list reverse, while playing around and observing:
85> erlang:is_builtin(lists, reverse, 1).
I found out that what is builtin is another function, reverse/2, which
is not much advertised, but that may be very useful, as the fastest way
to simultaneously reverse a list and concatenate to another.
87> lists:reverse("345", "21").
A list:join version exploring this reverse/2 is not much slower than the
version with ++.
join(, _Sep) -> ;
join([H|T], Sep) -> join(T, Sep, lists:reverse(H)).
join(, _Sep, Ac) -> lists:reverse(Ac);
join([H | T], Sep, Ac) ->
join(T, Sep, lists:reverse(H,lists:reverse(Sep,Ac))).
In other cases where we truly want to reverse and concatenate it will be
quite an amazing function to have around that deserves more advertising.
More information about the erlang-questions