[erlang-patches] Add lists:init/1 - got tired of implementing it

Fredrik <>
Fri May 17 09:46:18 CEST 2013


On 05/02/2013 03:27 PM, Hans Svensson wrote:
> On 2013-05-02 15:07, Garrett Smith wrote:
>> On Thu, May 2, 2013 at 2:00 AM, Hans Svensson <> wrote:
>>> You should consider compiling the code before measuring, there is a
>>> difference in speed...
>>> Also, if you'd done that you would have spotted the error in your 
>>> recursive
>>> implementation...
>> Indeed!
>>
>>> test_sc.erl:66: Warning: this clause cannot match because a previous 
>>> clause
>>> at line 65 always matches
>>>
>>> Your recursive implementation throws away the whole list 
>>> immediately, which
>>> is fast but wrong...
>> One must make certain sacrifices for speed ;)
>>
>>> Fixing the recursive implementation and re-running with escript (after
>>> changing the sizes of the tests into something smaller) I got
>>> reverse_reverse:small_list: 251
>>> reverse_reverse:big_list: 34
>>> recurse:small_list: 6752
>>> recurse:big_list: 7295
>>> sublist:small_list: 295
>>> sublist:big_list: 69
>> I nearly blew up my laptop running the correct version.
>>
>>> Which shows the severe performance penalty involved for not 
>>> compiling the
>>> code... Compiling it yields (with your original test sizes):
>>> reverse_reverse:small_list: 347
>>> reverse_reverse:big_list: 3133
>>> recurse:small_list: 411
>>> recurse:big_list: 4036
>>> sublist:small_list: 635
>>> sublist:big_list: 6175
>> Thanks for pointing this out!
>>
>> There's a -mode(compile) attribute you can add to escript files that
>> will compile them. In addition to getting a more representative
>> result, it gives you compiler warnings.
>>
>> It's interesting to me how optimized the recursive algorithm is when 
>> compiled!
>>
>>> However, the typical lists on which I'd use init/drop_last, would have
>>> length < 20
>> But you *could* use sublist in a pinch :)
> I could, but I'd have to look into the documentation to see, is it 
> sublist(L, 1, length(L) -1), sublist(1, L, length(L)-1), or sublist(L, 
> 0, length(L)-1). Instead I'd write reverse(tl(reverse(L))) for sure.
>> And if the semantics were awkward, you *could* write a small function
>> or macro to name it appropriately.
>>
>> I know I'm repeating myself, but I think there ought to be a high
>> standard for adding to core modules -- I just don't see it here.
> I also think there is a symmetry argument to make, we have hd and tl, 
> but we miss the companion to last!?
>>
>> Thanks very much for pointing out the compilation problem with 
>> erlang-bench!
> No problem, the results were so far from mine that I'd thought there 
> had to be something fishy going on...
>
> /Hans
>> Garrett
>>
>>> On 2013-04-30 15:32, Garrett Smith wrote:
>>>> I would use lists:sublist(L, 1, length(L) - 1) for this. I wouldn't
>>>> have given it a second thought.
>>>>
>>>> Presumably there's a concern about performance -- why else would we
>>>> need yet-another-function?
>>>>
>>>> Here's a simple benchmark program that people can experiment with (or
>>>> improve):
>>>>
>>>> https://github.com/gar1t/erlang-bench/blob/master/drop-last.escript
>>>>
>>>> It includes the original implementation, Fred's, and what I would use
>>>> (sublist).
>>>>
>>>> Personally, I don't see a problem that warrants a new function in the
>>>> lists module.
>>>>
>>>> On Tue, Apr 30, 2013 at 5:05 AM, Siri Hansen <> 
>>>> wrote:
>>>>> We haven't yet made any decision regarding this patch, but we have 
>>>>> had
>>>>> some
>>>>> discussions in the team and we are not totally convinced about the
>>>>> general
>>>>> need for this function. Thus we would appreciate some input from the
>>>>> list.
>>>>>
>>>>> So - disregarding the name and the implementation for a second - 
>>>>> is this
>>>>> functionality a good addition to the lists module? Is it often 
>>>>> needed?
>>>>>
>>>>> If so, would it be even better to do a more general version which 
>>>>> removes
>>>>> the N last elements from the list?
>>>>>
>>>>> Hans, could you also possibly describe some of your use cases?
>>>>>
>>>>> Regards
>>>>> 
>>>>>
>>>>>
>>>>> 2013/4/29 Fredrik <>
>>>>>> On 04/25/2013 05:12 PM, Hans Svensson wrote:
>>>>>>> git fetch git://github.com/hanssv/otp.git add_init_to_lists
>>>>>> Fetched, it is currently located in the 'pu' branch.
>>>>>> A review process has started.
>>>>>> Thanks,
>>>>>>
>>>>>> -- 
>>>>>>
>>>>>> BR Fredrik Gustafsson
>>>>>> Erlang OTP Team
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> erlang-patches mailing list
>>>>>> 
>>>>>> http://erlang.org/mailman/listinfo/erlang-patches
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> erlang-patches mailing list
>>>>> 
>>>>> http://erlang.org/mailman/listinfo/erlang-patches
>>>>>
>
> _______________________________________________
> erlang-patches mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-patches
Hello Hans,
I've got some feedback on your patch after review:
We have decided to reject this patch as we don't see a general need for 
the new function.

Thanks for showing interest in contributing!

-- 

BR Fredrik Gustafsson
Erlang OTP Team

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20130517/adbeff99/attachment-0001.html>


More information about the erlang-patches mailing list