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

Hans Svensson hanssv@REDACTED
Thu May 2 15:27:57 CEST 2013


On 2013-05-02 15:07, Garrett Smith wrote:
> On Thu, May 2, 2013 at 2:00 AM, Hans Svensson <hanssv@REDACTED> 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 <erlangsiri@REDACTED> 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
>>>> siri@REDACTED
>>>>
>>>>
>>>> 2013/4/29 Fredrik <fredrik@REDACTED>
>>>>> 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
>>>>> erlang-patches@REDACTED
>>>>> http://erlang.org/mailman/listinfo/erlang-patches
>>>>
>>>>
>>>> _______________________________________________
>>>> erlang-patches mailing list
>>>> erlang-patches@REDACTED
>>>> http://erlang.org/mailman/listinfo/erlang-patches
>>>>




More information about the erlang-patches mailing list