range simple toy problem

Steven Schveighoffer schveiguy at yahoo.com
Fri Jun 1 18:08:33 UTC 2018


On 6/1/18 1:00 PM, Xiaoxi wrote:
> import std.range;
> import std.algorithm;
> import std.string;
> import std.stdio;
> 
> void main()
> {
>    auto s = "1 2 3 4 5 6 7 8 9";
>    auto iter = s.split(" ").drop(2);
> 
>    // How to find the unconsumed/not-split part of s here?
>    // i.e. "3 4 5 6 7 8 9" NOT ["3", "4", "5", "6", "7", "8", "9"]
>    // s[??? .. $] <- what goes here?
> }
> 
> split is just an example, it's a generic question if you chain multiple 
> lazy functions and then consume a part of the data... how do you know 
> how to slice the original buffer to point to the unconsumed data? 
> Imagine the chain could be quite long
> 
> s.one.two.three.four.five.six.seven()
> 
> You don't really want to lazily add the inverse of all the functions and 
> they might even be destructive so it might not be possible in all cases.

Yes, this is a problem in range-land that is difficult to solve.

I don't know of a good answer to it. Probably you want to use algorithms 
instead of range wrappers to do this, but I don't know how to do this 
one-liner style.

I found ranges/algorithms substandard when trying to get the *other* 
data instead (i.e. what if you wanted "1 2" instead).

-Steve


More information about the Digitalmars-d-learn mailing list