11/10/2012 11:07 PM, Jonathan M Davis пишет:
And actually, to make matters worse, I'm not sure that scope on delegates is
working correctly. I thought that it was, but this code compiles:

import std.stdio;

void delegate() global;

void foo(scope void delegate() del)
{
     global = del;
}

void main()
{
     {
         char[5] bar = "hello";
         foo((){writeln(bar);});
     }
     char[7] baz = "goodbye";

     global();
}

It also prints out "hello", and if a closure had not been allocated,
I would
have at least half-expected it to print out "goodb", because I'd have thought
that baz would have been taking up the same memory that bar had been.

Nope. It's just that the stack is intact and contains: hello and goodbye one after another. Without optimizations { } scope doesn't mean reuse stack space.

Now if play with stack a bit, for me the next one prints:
­-²↑

import std.stdio;

void delegate() global;

void foo(scope void delegate() del)
{
    global = del;
}


void f()
{
    {
        char[5] bar = "hello";
        foo((){writeln(bar);});
    }
}

void main()
{
    char[7] baz = "goodbye";
    f();

    global();
}

--
Dmitry Olshansky

Reply via email to