Walter Bright Wrote:

> http://www.reddit.com/r/programming/comments/9fk6g/how_nested_functions_work_part_1/

I really like the way nested functions and closures are done in D. Especially 
because they are the same thing as delegate and closures.

But speaking of closures, I did notice something that could be optimized:

void foo {
    int a;
    void foo2() { a++;}
    bar(&foo2);
}
void bar(in void delegate() dg) { dg(); }

Here foo() is using _d_allocmemory to get storage for the stack frame. I 
understand it is for cases where the closure is executed long after the owner 
method has returned, but if the delegate has a scope storage class it could use 
the thread's stack instead.

Using nested functions alone does use the stack for storage, unless you need to 
use a local delegate to fix forward references within nested functions 
resulting in _d_allocmemory allocating the stack frame, as in the following 
example:

void myFoo() {
    int a;
    scope void delegate() bar = void;
    void foo() { bar(); }
    void foo2() { a++; if(a != 10) foo(); }
    bar = &foo2;
    foo();
}

Closures in D is an amazing feature and I really miss it when I need to use 
another language (I can't find an employer who wants D code, but I keep my 
fingers crossed!), but here is yet another feature I try to avoid in time 
critical code right now because of the expensive call into the memory manager 
when I can write longer code that executes on stack storage.

Anywho, thanks for the link Walter, I'm not really familiar with C# and it's 
nice to know D beats its syntax, I would hate to have to assign delegates for 
every nested function!

Reply via email to