lists:seq/3 strange behaviour

Pascal Chapier <>
Tue Jun 8 14:08:51 CEST 2010


In fact it does exactly what it is written in the documentation:


seq(From, To, Incr) -> Seq


Types:

        
>From = To = Incr = int()


        
Seq = [int()]


      

        


Returns a sequence of integers which starts with From
          and contains the successive results of adding Incr to
          the previous element, until To has 
been reached or
          passed (in the latter case, To is 
not an element of
          the sequence). Incr defaults to 1.

        

Failure: If To<From-Incr and Incr
          is positive, or if To>From-Incr 
and Incr is
          negative, or if Incr==0 and From/=To.

and implemented in the code:

seq(First, Last, Inc) 
    when is_integer(First), is_integer(Last), is_integer(Inc) -> 
    if
        Inc > 0, First - Inc =< Last;
        Inc < 0, First - Inc >= Last ->
            N = (Last - First + Inc) div Inc,
            seq_loop(N, Inc*(N-1)+First, Inc, []);
        Inc =:= 0, First =:= Last ->
            seq_loop(1, First, Inc, [])
    end.


But you are right, the purpose of the If test is to evaluate the length of the list, and as there is no default contition which could produce an empty list, I guess that the intent was to generate an exception when parameters cannot produce finite non empty list. So I think it is a bug and tha the code should be

seq(First, Last, Inc) 

    when is_integer(First), is_integer(Last), is_integer(Inc) -> 

    if

        Inc > 0, First + Inc =< Last;

        Inc < 0, First - Inc >= Last ->

            N = (Last - First + Inc) div Inc,

            seq_loop(N, Inc*(N-1)+First, Inc, []);

        Inc =:= 0, First =:= Last ->

            seq_loop(1, First, Inc, [])

    end.

and the doc: Failure: If To<From+Incr and Incr
          is positive, or if To>From-Incr 
and Incr is
          negative, or if Incr==0 and From/=To.

Or, a solution that I prefer, add a default condition which return an empty list as you suggest.

Pascal.



 		 	   		  
_________________________________________________________________
La boîte mail NOW Génération vous permet de réunir toutes vos boîtes mail dans Hotmail !
http://www.windowslive.fr/hotmail/nowgeneration/


More information about the erlang-questions mailing list