Steven Schveighoffer wrote:
Currently, D supports the special symbol $ to mean the end of a
container/range.
However, there is no analogous symbol to mean "beginning of a
container/range". For arrays, there is none necessary, 0 is always the
first element. But not all containers are arrays.
I'm running into a dilemma for dcollections, I have found a way to make
all containers support fast slicing (basically by imposing some
limitations), and I would like to support *both* beginning and end symbols.
Currently, you can slice something in dcollections via:
coll[coll.begin..coll.end];
I could replace that end with $, but what can I replace coll.begin
with? 0 doesn't make sense for things like linked lists, maps, sets,
basically anything that's not an array.
One thing that's nice about opDollar is I can make it return coll.end,
so I control the type. With 0, I have no choice, I must take a uint,
which means I have to check to make sure it's always zero, and throw an
exception otherwise.
Would it make sense to have an equivalent symbol for the beginning of a
container/range?
In regex, ^ matches beginning of the line, $ matches end of the line --
would there be any parsing ambiguity there? I know ^ is a binary op,
and $ means nothing anywhere else, so the two are not exactly
equivalent. I'm not very experienced on parsing ambiguities, but things
like ~ can be unambiguous as binary and unary ops, so maybe it is possible.
So how does this look: coll[^..$];
Thoughts? other ideas?
-Steve
If we were to have something like this (and I'm quite unconvinced that
it is desirable), I'd suggest something beginning with $, eg $begin.
But, it seems to me that the slicing syntax assumes that the slicing
index can be mapped to the natural numbers. I think in cases where
that's not true, slicing syntax just shouldn't be used.