I'm reading http://learnyousomeerlang.com/ which includes a tail recursive sublist function that reverses the list to preserve order. I have written an alternative that does not require the reverse call. Is mine more efficient (it is certainly more verbose, but I'm not concerned with that), or have I overlooked something?
-module(sublist).
-export([sublist/2,sublistR/2]).
-include_lib("eunit/include/eunit.hrl").
sublist(_,0) ->
[];
sublist([],_) ->
[];
sublist(List,Length) ->
sublist([hd(List)], tl(List), Length-1).
sublist(Acc,[],_) ->
Acc;
sublist(Acc,_,0) ->
Acc;
sublist(Acc,Tail,Length) ->
sublist(Acc++[hd(Tail)], tl(Tail), Length-1).
sublistR(L, N) -> lists:reverse(sublistR(L, N, [])).
sublistR(_, 0, SubList) -> SubList;
sublistR([], _, SubList) -> SubList;
sublistR([H|T], N, SubList) when N > 0 ->
sublistR(T, N-1, [H|SubList]).
sublist_test() ->
sublisttest(fun sublist:sublist/2),
sublisttest(fun sublist:sublistR/2).
sublisttest(SublistFunc) ->
[] = SublistFunc([],10),
[] = SublistFunc([1,2,3], 0),
[1,2,3] = SublistFunc([1,2,3],3),
[1,2,3] = SublistFunc([1,2,3],4),
[1,2] = SublistFunc([1,2,3],2).