On 6/23/16 3:20 PM, Timon Gehr wrote:
On 23.06.2016 14:58, Steven Schveighoffer wrote:
On 6/21/16 5:19 PM, Timon Gehr wrote:


The problem here is that both variants make sense depending on context
and there is no syntax to distinguish between them. This proposal
interacts in a weird way with IFTI.

I know you are probably right, but can you explain maybe via an example
what you mean? I'm not understanding your point.


One might legitimately want to pass a inout delegate to some inout
function and then use the delegate on data with arbitrary mutability
qualifiers, not just inout.

As you say, we don't have a lot of options. We only have one designation for inout, and we must treat it the same no matter where it is.

A possible workaround is to store the inout function pointer/delegate as a global variable. I don't like that idea at all, but it would work.

Perhaps we could find a way to mark a function parameter as not being part of the inout wrapping, or perhaps mark it as *being* part of the inout wrapping (to be backwards compatible). But this is a special thing for delegates and function pointers only, since it makes no sense for plain parameters.

The more I think about it, the more I think we need to have a clear demarcation of when you want the inout-containing delegate to participate in the wrapping or not. We can't eliminate existing behavior, and without special marking, the rules are going to be ugly and unintuitive.

The IFTI comment was about for example something like this:

struct S{
    void bar(inout int){}
    void foo(T)(T arg)inout{
        // this looks like it can be called with any argument
        arg(&bar);
    }
}

void main(){
    immutable(S) s;
    void delegate(void delegate(inout(int))) dg = x=>x(2);
    s.foo(dg); // today, this works
    // with the proposed semantics, IFTI deduces
    // T = void delegate(void delegate(inout(int)))
    // but then cannot convert dg to a T after
    // inout resolution
}

Considering the possible use cases for something like this, I think we are better off having this limitation than not being able to use opApply with inout.

-Steve

Reply via email to