inout and function/delegate parameters

Timon Gehr timon.gehr at gmx.ch
Sun Feb 19 15:10:22 PST 2012


On 02/19/2012 11:27 PM, kenji hara wrote:
> I think the 'scope' keyword may resolve issue.
>
> Attributes of lazy parameter in template function belong to caller side.
>
> int foo()(lazy int value) @safe pure /*nothrow*/ { return value(); }
> void main() {
>      int n = foo(10);
>      // evaluating lazy parameter never break safety and purity of foo.
>      // (violating nowthrow-ness might be a bug.)
>      // because the violation belongs to caller side - it is main function.
> }
>
> Similarly, scope delegate body always in caller side, so calling it
> means temporary exiting to caller side.
>
> void foo(ref inout int x, scope void delegate(ref inout(int)) dg) {
>      dg(x);
> }
> void main() {
>      int a;
>      foo(a, (ref int x){ x = 10; });  // don't break foo's inout-ness,
> so should be allowed
>      assert(a == 10);
> }
>
> How about?
>
> Kenji Hara
>

If I get you right, then this cannot work in general.

immutable int y=0;
void foo(ref inout int x, scope void delegate(ref inout(int)) dg) {
     dg(y); // boom
}


More information about the Digitalmars-d mailing list