equivariant functions
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Oct 13 14:09:02 PDT 2008
Steven Schveighoffer wrote:
> "Andrei Alexandrescu" wrote
> I'm glad you are looking into this. This is along the same vein as what I
> called 'scoped const' (see
> http://d.puremagic.com/issues/show_bug.cgi?id=1961), but I only addressed
> const variance.
>
> Just in terms of const, I have a case where your solution doesn't help/work.
>
> Easiest case is min/max:
>
> typeof(v1) min(T)(const(T) v1, const(T) v2) { if(v1 < v2) return v1; return
> v2;}
>
> Now, imagine you call it like this:
>
> char[] best = "bb".dup;
> best = min(aa, "aa");
>
> If the function and usage are allowed to compile, then this results in best,
> being a char[], to be pointing to an invariant(char)[].
The function doesn't compile per the typechecking I discussed in a
different post.
> There are two problems that need to be solved here. First, you need another
> const type. One that is treated as const, but is implicitly castable back
> to the argument type, and can't be implicitly casted to. That type modifier
> needs to be perpetuated throughout the function, because you shouldn't be
> able to return things that didn't originate from the input. If I create a
> temporary variable, I should have to use this modifier to declare the
> variable (in my proposal, at the suggestion of Janice, I used 'inout', a
> dead keyword). This guarantees that your output is a subset of the input.
I think the typedef-based approach could work (and be that type you
mention).
> An example of how min looks in my proposal (with the proposed 'inout'
> keyword):
>
> inout(T) min(T)(inout(T) v1, inout(T) v2)
>
> The second problem is, you want the return type to be dependent on both v1
> and v2. In my proposal, the return type could depend on multiple arguments,
> and if they varied by constancy, the return type was defaulted to const, as
> this is the only possible type that anything can be casted to.
>
> You might be tempted to do something like this:
>
> typeof(v1) min(T)(const(T) v1, typeof(v1) v2)
>
> But then if you pass in the mutable version as the first, the function fails
> to compile in the usage I have above.
My solution does theoretically support multiple types by including them
in the typeof expression. Walter, however, mentioned potential
difficulties with implementing them.
Andrei
More information about the Digitalmars-d
mailing list