digitalmars.D - Range proposal
- Bill Baxter (36/36) Sep 09 2008 The current range proposal may be putting too much emphasis on the
- Bruce Adams (12/13) Sep 10 2008 What current range proposal? I'm interested in what you're saying but a ...
- Bill Baxter (10/21) Sep 10 2008 Oh, seems it's actually taking place on digitalmars.d.announce.
- Manfred_Nowak (20/21) Sep 10 2008 The problem with both models is, that there are canonical operators one
- Bill Baxter (8/23) Sep 10 2008 Well not necessarily synonyms, because how that iterator is turned
The current range proposal may be putting too much emphasis on the range being a contiguous linear entity. As something which represents a begin and and end and *everything in between*. That is only true in certain special cases. Even with linked lists, you don't really have that. You just have two pointers that could be pointing to anywhere in memory. The range doesn't really represent everything in between those pointers. Other examples that contradict thinking of a range as simply "here to there and everything in between" are infinite generators, or random iterators (like the HMM example). It may lead to a cleaner nomenclature if we acknowledge this fact, and think of a range more as an iterator plus a sentinel, rather than trying to emphasize the symmetry between the beginning and end items that really only exists for special cases. In this terminology the "left" thing points at the "value" and the "right" thing is the "end". Here's one way that could pan out: ** Basics r.atEnd() -- instead of r.isEmpty() ** Input range/ Forward range e = r.value -- instead of r.left r.next -- still ok r.moveTo(s) -- instead of rightUnion r.moveToEndOf(s) -- instead of rightDiff ** Bidirectional range r.last -- instead of r.right r.pop -- ok as-is r.moveEndToEndOf(s) -- instead of leftUnion --> or just s.moveTo(r) r.moveEndTo(s) -- instead of leftDiff ** Random access ok as-is So re-iterating, the basic idea is to think of a range as an iterator with a current value, that happens to have an extra thing hanging around, it's "end", a sentinel that marks a stopping condition. Thoughts? --bb
Sep 09 2008
On Wed, 10 Sep 2008 04:42:25 +0100, Bill Baxter <wbaxter gmail.com> wrote:The current range proposal...What current range proposal? I'm interested in what you're saying but a little context would be nice. The same with your post on bi-directional iterators. I googled and found this: http://ssli.ee.washington.edu/~aalexand/d/tmp/std_range.html The only thing that indicates that this is a proposal and not a full integrated and implemented library is the tmp in the URL. So what discussion have I missed? Regards, Bruce.
Sep 10 2008
On Wed, Sep 10, 2008 at 4:13 PM, Bruce Adams <tortoise_74 yeah.who.co.uk> wrote:On Wed, 10 Sep 2008 04:42:25 +0100, Bill Baxter <wbaxter gmail.com> wrote:Oh, seems it's actually taking place on digitalmars.d.announce. You really can't omit d.announce if you're interested in discussions about D's future. For better or worse, mondo threads pop up there all too often on the heels of big announcements.The current range proposal...What current range proposal? I'm interested in what you're saying but a little context would be nice. The same with your post on bi-directional iterators. I googled and found this: http://ssli.ee.washington.edu/~aalexand/d/tmp/std_range.htmlThat's the one.The only thing that indicates that this is a proposal and not a full integrated and implemented library is the tmp in the URL. So what discussion have I missed?digitalmars.d.announce. I suppose he wrote the proposal as if it were a done deal to avoid having to rewrite it when it is a done deal. --bb
Sep 10 2008
Bill Baxter wrote:think of a range more as an iterator plus a sentinelThe problem with both models is, that there are canonical operators one both models, which are somehow frantically hidden. This is shown 1) by the deliberately constructed compound of `[left,right] [Diff,Union]' 2) the missing definition of a "subrange" Both seem undefinable without having some notion of "concatenation"--- and if one has concatenation, a request for the reverse operation "splitting" is unavoidable. In fact the semantics of `r.moveTo(s)' seems not to be fully defined in both approaches. In fact in your approach of thinking of `r.moveto(s)', the "iterator" of `s' turns into a "sentinel" for `r', thereby making sentinels and iterators to synonyms. If there is indeed a structural similarity to Andrei's approach, the same problem must show up somewhere. -manfred -- If life is going to exist in this Universe, then the one thing it cannot afford to have is a sense of proportion. (Douglas Adams)
Sep 10 2008
On Thu, Sep 11, 2008 at 2:04 AM, Manfred_Nowak <svv1999 hotmail.com> wrote:Bill Baxter wrote:Well not necessarily synonyms, because how that iterator is turned into a sentinel is up to the moveTo method. But yeh, in most cases they probably would be implemented under the hood using the same type -- that's how STL works, after all, and it turns out reasonably well. And probably how boost's ranges are implemented, just as a pair of iterators... (though I admit I haven't taken a look at those at all). --bbthink of a range more as an iterator plus a sentinelThe problem with both models is, that there are canonical operators one both models, which are somehow frantically hidden. This is shown 1) by the deliberately constructed compound of `[left,right] [Diff,Union]' 2) the missing definition of a "subrange" Both seem undefinable without having some notion of "concatenation"--- and if one has concatenation, a request for the reverse operation "splitting" is unavoidable. In fact the semantics of `r.moveTo(s)' seems not to be fully defined in both approaches. In fact in your approach of thinking of `r.moveto(s)', the "iterator" of `s' turns into a "sentinel" for `r', thereby making sentinels and iterators to synonyms.
Sep 10 2008