equivariant functions
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Tue Oct 14 09:16:17 PDT 2008
Steven Schveighoffer wrote:
> "Andrei Alexandrescu" wrote
>> I discussed with Walter a variant that implements equivariant functions
>> without actually adding an explicit feature to the language. Consider:
>>
>> typeof(s) stripl(const(char)[] s);
>
> As another point on this, I think someone else mentioned it, but I can't
> find the post.
>
> I don't like the way this looks. The way it reads is 'stripl returns the
> same type as s', but really, the typeof(s) is actually modifying the type of
> the argument also. This seems very unintuitive.
I agree. We need to look for a better notation.
> I understand the need to not change the language, but I think most would
> prefer a syntax where the type modifier is specified on at least the
> argument. People are going to be extremely confused when they can't treat
> 's' like a normal const(char)[].
>
> If the ultimate result is that no intuitive syntax can be made without
> changing the language, then I think it is more important to have this
> feature than to not change the language.
>
> One other syntax that Janice proposed (and I later put into a bugzilla), is
> to use the dead keyword inout. Meaning, what you send in is what you get
> out. ref already completely replaces inout, so there is no need to keep it
> under its current meaning:
>
> inout(char)[] stripl(inout(char)[] s);
>
> I'm not in love with this completely, but it has the benefit of not
> requiring a new keyword.
Also I guess:
class C
{
Range!(inout(C)) foo() inout;
}
And also:
class Base {}
class Derived : Base {}
inout foo(inout Base b);
I think this could work and doesn't look half bad. Of course, you'll be
tasked with addressing protests about yet another D1/D2 incompatibility. :o)
Andrei
More information about the Digitalmars-d
mailing list