Re: Add lists:init/1 - got tired of implementing it
Fredrik <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.patches |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> 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 <[email protected]> >>>> 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@otp >>>>> >>>>> >>>>> 2013/4/29 Fredrik <[email protected]> >>>>>> 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 >>>>>> [email protected] >>>>>> http://erlang.org/mailman/listinfo/erlang-patches >>>>> >>>>> >>>>> _______________________________________________ >>>>> erlang-patches mailing list >>>>> [email protected] >>>>> http://erlang.org/mailman/listinfo/erlang-patches >>>>> > > _______________________________________________ > erlang-patches mailing list > [email protected] > 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 _______________________________________________ erlang-patches mailing list [email protected] http://erlang.org/mailman/listinfo/erlang-patches