Revised RFC on range design for D2

Sergey Gromov snake.scaly at gmail.com
Fri Sep 12 12:00:14 PDT 2008


Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org> wrote:
> Sergey Gromov wrote:
> > Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org> wrote:
> >> Sergey Gromov wrote:
> >>> Bill Baxter <wbaxter at gmail.com> wrote:
> >>>> On Fri, Sep 12, 2008 at 11:58 PM, Sergey Gromov <snake.scaly at gmail.com> wrote:
> >>>>>> So basically you changed
> >>>>>> done ==> empty
> >>>>>> head ==> tip
> >>>>>> retreat ==> prev
> >>>>>> ?
> >>>>> The insight was about get/put ==> next.  That's the most significant
> >>>>> change, others are merely renames as you rightfully point out.  Hence
> >>>>> the "prev" which should mean both "get at the end" and "put to the end".
> >>>> Ah ok.  Your switching to declaration syntax instead of usage syntax
> >>>> confused me. :-)
> >>>>
> >>>> That is cute.  So
> >>>>    r.put(e) ==> r.next = e
> >>>> It would also mean the copy to output idiom would become
> >>>>
> >>>> for(; ! i.done; i.next)
> >>>>    o.next = i.head;
> >>>>
> >>>> Would be cooler if it could be just while(!i.done) o.next = i.next;
> >>>> .. oh well.
> >>> Exactly, I wanted it to be
> >>>
> >>> while (!i.done)
> >>>     o.next = i.next;
> >> Hmm, let's see. So:
> >>
> >> a) If i is an input range, then i.next returns by value.
> >>
> >> b) If i is a forward range, then i.next returns by reference.
> >>
> >> I assume that's what you had in mind?
> > 
> > Not quite.
> > 
> > You cannot mutate an input range, it must be in specs.  Therefore it's
> > up to the range designer what to return.  LineEater will return a const 
> > reference to an internal buffer.  RNG will return int.  Array will 
> > return a const reference to its element.  Some could return a new class 
> > instance every time.
> 
> Given that in D const is transitive, we can't operate with const the 
> same way C++ does. Consider something as trivial as a copy:
> 
> Tgt copy(Src, Tgt)(Src src, Tgt tgt)
> {
>      for (; !src.done; src.next) tgt.put(src.tip);
> }
> 
> Problem is, you won't be able to copy e.g. an int[][] to another because 
> the types aren't compatible.

If Src is an input range you must make a deep copy.  This holds true for 
your current design also.  So this algorithm is flawed and it's good if 
it won't compile.

I don't know how to make a generic deep copy, but I believe your meta-fu 
is much stronger than mine, so I'll leave it to you.  ;)


More information about the Digitalmars-d-announce mailing list