Tricky semantics of ranges & potentially numerous Phobos bugs

Jonathan M Davis jmdavisProg at gmx.com
Tue Oct 16 10:03:05 PDT 2012


On Tuesday, October 16, 2012 08:17:40 H. S. Teoh wrote:
> On Tue, Oct 16, 2012 at 05:01:57PM +0200, Tommi wrote:
> > On Tuesday, 16 October 2012 at 05:49:11 UTC, Jonathan M Davis wrote:
> > >So, I don't really know what the right answer is, but I _really_
> > >don't like the idea of having to worry about the result of front
> > >changing after a call to popFront in every single function that ever
> > >uses front.
> > 
> > Isn't the deeper underlying problem here the fact that there's no
> > generic way to make a deep copy in this language (does any language?)
> > Making a deep copy of front would be a clean solution. I don't know
> > how to implement this generic deep copying functionality though. For
> > example: what would be the semantics of deep-copying a range?
> 
> I don't think the problem here is whether we have a deep copy or not,
> but that the semantics of ranges are not defined clearly enough. If we
> clearly state, for example, that whatever is returned by .front must
> persist beyond popFront(), then it would be up to the range to implement
> the deep copy, e.g., return the .dup or .idup'd array instead of a
> reference to an internal buffer.

1. There is no generic way to deep copy stuff. So, requiring a deep copy of 
front just plain doesn't make sense. It would be completely untenable. By 
doing so, you basically make it impossible to use the result of front beyond a 
call to popFront in the general case.

2. Often, a deep copy isn't needed in the least, even with a messed up range 
like ByLine. If it were an array of class objects rather than char, doing a 
deep copy would needlessly copy all of those class objects as well. It could 
quickly become a performance nightmare.

- Jonathan M Davis


More information about the Digitalmars-d mailing list