equivariant functions

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue Oct 14 09:51:56 PDT 2008


Steven Schveighoffer wrote:
> "Andrei Alexandrescu" wrote
>> 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);
> 
> In this last example, what does the inout mean at the front?

Accept and return any subtype of Base.

Andrei



More information about the Digitalmars-d mailing list