equivariant functions
KennyTM~
kennytm at gmail.com
Tue Oct 14 11:16:33 PDT 2008
Denis Koroskin wrote:
> On Tue, 14 Oct 2008 21:04:01 +0400, Steven Schveighoffer
> <schveiguy at yahoo.com> wrote:
>
>> "KennyTM~" 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);
>>>>
>>>> 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
>
> I think that basic idea is very good! (for some reason I was bound to
> constness issue and didn't think about the latter example).
>
>>>
>>> I'm afraid the meaning of inout here is very unclear without
>>> explanation.
>>
>> You are correct. It means 'what you send in as input gets returned as
>> output.'
>>
>> In reality, it's not the best name for this type of thing, but it has the
>> benefit of using a defunct keyword -- no new keywords necessary.
>>
>> I can't think of a really good keyword that is short and would not
>> require
>> explanation. Perhaps you can? Then we have to weigh the benefits of
>> having
>> a new keyword vs. having to post an explanation as to what it means. My
>> guess is we'll have to post an explanation no matter what.
>>
>> -Steve
>>
>>
>
> I have previously proposed the 'same' keyword:
>
> same(Base) foo(same(Base) bar)
> {
> bar.callSomeBaseMethod();
> return bar;
> }
>
> foo(new Derived());
>
> interface IClonable {
> same(this) clone();
> }
>
> It is short and very descriptive.
>
> Frankly speaking, I don't see the difference between inout or some other
> keyword. You either ditch inout and introduce FOO or obsolete inout and
> reuse it. Both have similar effect: some code is broken and needs fixing
> (because inout doesn't work anymore), a new keyword is introduced to
> denote the feature. The only difference is a possible name collision
> that any new keyword might introduce. But it is nothing to worry about,
> because short and meaningful keywords are more important than some
> potentially broken (and easily fixable) code for the language in a long
> run.
“same” seems to be a common identifier though...
“inout” already has an equivalent keyword. It is called “ref”.
More information about the Digitalmars-d
mailing list