Dnia 16-08-2010 o 17:17:32 Steven Schveighoffer <schvei...@yahoo.com>
napisał(a):
* Perhaps a good starting point is to look at std.container.SList and
see how const(SList!T) can be manipulated.
We can start simpler than that. Give a struct:
struct Array(V)
{
uint length;
V *v;
}
How can we turn Array!V into Array!(const(V)) implicitly...
This will duplicate array tail-const, and be essential to making
tail-const ranges.
It should be a good starting test for any library/compiler solution.
Nice litmus test. I thought about it for a while and came up with:
Array!int arr = ... ;
Rebindable!(const Array!V) r = arr;
It actually compiles if you remove the template constraint off Rebindable.
But tail const/immutable is generally desired so you'd end up with
rebindable everywhere making variable manipulation cumbersome, the code
less auditable, giving easy counter-arguments in language wars ("D must
resort to casts, so much for the type system revolution, haha"), etc.
Plus, there's the merriness with shared (tail-shared structures, anyone?
and of course you'd want a tail-const view on it at some point, etc).
Rebindable (this name doesn't scale) would basically have to reimplement
all of D's type conversions via operator overloading, template
constraints, static ifs, and blunt casts. Like as if implementing all this
in a compiler alone wasn't hard enough...
Tomek