[erlang-questions] list:join() for erlang?

Paulo Sérgio Almeida psa@REDACTED
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.
> /Bjorn

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 mailing list