So what does (inout int = 0) do?

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 15 16:05:14 PDT 2016


On 4/15/16 6:31 PM, Timon Gehr wrote:
> On 15.04.2016 23:56, Steven Schveighoffer wrote:
>>
>> Impossible or difficult to do with the current implementation?
>> ...
>
> What I'm saying is that the check that is currently implemented is not
> adequate for the new case. This is not terribly important though. The
> point was that there needs to be a design effort beyond lifting the
> limitation, and you seemed to claim that the current implementation
> already takes care of the presented issue, which is not the case.
>
> Your ideas are sound though.

I'm sorry, should have put on my standard disclaimer that I am not a 
compiler writer :) I actually have no idea how this is done in the 
compiler, just how a compiler should behave as I understand it in my head.

>> I may have said this incorrectly. The language itself wouldn't really be
>> that much more complex. It's the cost of understanding what each of the
>> different inout pools mean.
>
> They would just be named parameters to the function on the type system
> level, similar to template arguments but not causing repeated
> instantiation.

Right, but again: these are named by the writer of the template, not the 
language, right? In that case, any identifier becomes a modifier. Or are 
you thinking of something different?

>> The benefit would be quite small, whereas
>> there are obvious places inout makes sense -- the 'this' parameter and
>> the return value.
>> ...
>
> The return value might contain more than one pointer, and functions
> often have more than one parameter.

Of course, but the transference of mutability from parameter to return 
value is the obvious draw of such a wildcard. In most cases, there is 
only one return value, and therefore only one pool that needs to be handled.

ref/out parameters can serve as alternate returns as well as composed types.

It's not that functions don't have multiple returns with their own 
inout, but I don't think it's very common. As we get more and more 
obscure, the cost/benefit ratio for complexity vs. power gets higher. 
And already people don't like where we are right now with it.

>> Then there is the syntax that would be required, I'm not sure what that
>> looks like.
>> ...
>
> Anything that is analogous to template parameters, e.g. an additional
> set of arguments with a different delimiter. Many workable
> possibilities. Anyway, it is unlikely to happen.

Especially given the discussion happening here, I agree.

>> Humans are creatures of habit and familiarity. To allow each library to
>> define what words mean what for modifiers would be really difficult to
>> deal with.
>>
>
> I don't see how the library would do that.

Just throwing a strawman out there:

void foo(bingo = inout, zingo = inout)(bingo(int)* x, zingo(int)* y)

So inside foo, bingo is one flavor of inout, zingo is another. This 
could vary library to library, function to function.

It would work, and be sound design. I would just hate it is all :)

Perhaps you have a better system in mind?

-Steve


More information about the Digitalmars-d mailing list