"James Miller" <ja...@aatch.net> wrote in message 
news:mailman.1324.1333434077.4860.digitalmar...@puremagic.com...
>
> [...]the issue
> is with closures, what values should be visible to the closures?

Personally, I don't much care ATM. Either way has it's pros and cons:

A. Same as right now: The nested function can only access variables defined 
before it. Only difference is that it can *also* access "sibling" nested 
functions that are defined before *or* after. The benefit is that there's 
minimal change to the current "sequential visibility".

B. Let nested funcs access *any* "sibling" symbol whether defined before or 
after. Presumably, the nested func would not be *callable* until after all 
the sibling symbols it accesses have been declared. The downside is that, I 
suspect, this might be more work to implement. The benefits are that it 
provides more flexibility and is more consistent with module-level 
declarations. That latter benefit would be import for code like this:

void main() {  mixin(import("script.d"));  }

I guess I would lean more towards "B", but it is a bigger change and I 
realize bigger changes meet bigger resistance at this point. So I'd be 
content either way because what's *more* important here is we ditch the 
(seemingly) silly restriction of "no mutually recursive nested funcs".

'Course, another approach would be to just for the compiler to treat this:

void foo()
{
    /+ code 1 +/
    void a() {...};
    /+ code 2 +/
    void b() {...};
    /+ code 3 +/
}

Like this:

void foo()
{
    void delegate() a;
    void delegate() b;

    /+ code 1 +/
    a = () {...};
    /+ code 2 +/

    b = () {...};
    /+ code 3 +/

    // Except that, naturally, a and b cannot
    // be re-assigned by the programmer,
    // and foo itself cannot access a or b
    // before the "a = ...;" and "b = ...;" lines
    // respectively.
}

This maybe makes the most sense, because nested funcs and 
anon-funcs-assigned-to-a-variable *are* so very similar anyway. But then 
again, this comes with the downside of "void main() { 
mixin(import("script.d"));  }" causing strange semantics inside 
'script.d'...but I guess such strange semantics in 'script.d' would be the 
case even without any nested funcs involved.

Actually, this might be equivalent to approach "A" above.


Reply via email to