non empty slices

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jun 2 07:31:15 PDT 2016


On 06/02/2016 03:37 PM, Alex wrote:
> The question is, how to define the same thing for ranges. What I started
> with is:
>
> import std.range : iota;
> alias MrSlice = typeof(iota(M.init));
>
> so far, so good. The MrSlice-thing is the analogy for Mr, as it can be
> empty, as Mr can.
> What I also need is the analogy for the M-thing. But how can I define a
> slice, which is not-empty by definition?

A little terminology: "Slice" is not a synonym for "range". iota does 
not return a slice, it returns a range. "Slice" is being used as a 
synonym for "dynamic array" (Type[]), and in the context of the slicing 
operator (expression[] or expression[a .. b]).

Now, for the actual question - how to define a range that is non-empty 
by definition:

One of the range primitives is popFront. popFront removes one element 
from the range. popFront cannot change the type of the range. So you 
can't have a type that is a range, and is guaranteed not to be empty, 
and can be emptied by calling popFront.

But you can have a type that is a range, is guaranteed not to be empty, 
and *cannot* be emptied by calling popFront: an infinite range. That's a 
range that never gets empty no matter how often popFront is called.

The library recognizes infinite ranges when you define `empty` like 
this: `enum bool empty = false;`. There's 
std.range.primitives.isInfinite [1] to check for them.

I guess that's not really what you're looking for. I don't think you can 
otherwise statically check that a range isn't empty. You could probably 
make a wrapper that checks once on construction, but that's still a 
run-time check. And I don't see it being particularly useful, because 
popFront is an essential parts of ranges.

[...]
> I tried also something using Algebraic types with an underlying int, but
> couldn't manage to append elements to something like:
> alias List2 = Algebraic!(This[]);
> or
> alias List(Leaf) = Algebraic!(Leaf, This*);
>
> The cool thing is, if the algebraic stuff works, it would potentially be
> able to replace all four aliases altogether...
> But a knock-out criteria is: the solution has to be @nogc

You've lost me there. I don't see how non-empty range and Algebraic connect.


[1] https://dlang.org/phobos/std_range_primitives.html#.isInfinite


More information about the Digitalmars-d-learn mailing list