questions about lists module implementations.

Angel Alvarez <>
Thu Dec 10 23:37:03 CET 2009


Im reading otp sources trying to check my skills as i progress onto the language.

Two function got my attention:

%% reverse(L) reverse all elements in the list L. Is now a BIF!

-spec reverse([T]) -> [T].

reverse([] = L) ->
reverse([_] = L) ->
reverse([A, B]) ->
    [B, A];
reverse([A, B | L]) ->
    lists:reverse(L, [B, A]).

%reverse([H|T], Y) ->
%    reverse(T, [H|Y]);
%reverse([], X) -> X.

Well, in fact is not clear for me why current function is a BIF (do BIF functions have precedence over erlang coded ones?)
cause being a BIF i dont understand why is still on the lists module source...

Is there a risk of calling the wrong function if you make a function named like a BIF?

i think of mytest:reverse vs reverse (BIF).

why is better than the previous incarnation (commented out).?

The second issue comes from the strange way seq is defined. 
Is that a form of loop unrolling?

-spec seq(integer(), integer()) -> [integer()].

seq(First, Last)
    when is_integer(First), is_integer(Last), First-1 =< Last ->
    seq_loop(Last-First+1, Last, []).

seq_loop(N, X, L) when N >= 4 ->
     seq_loop(N-4, X-4, [X-3,X-2,X-1,X|L]);
seq_loop(N, X, L) when N >= 2 ->
     seq_loop(N-2, X-2, [X-1,X|L]);
seq_loop(1, X, L) ->
seq_loop(0, _, L) ->

Agua para todo? No, Agua para Todos.
    Clist UAH a.k.a Angel

More information about the erlang-questions mailing list