On Wednesday, 28 September 2016 at 21:00:00 UTC, Steven Schveighoffer wrote:
Moreover, Idan's suggestions about scope sharing make sense to me and I don't think his line of thinking would be compatible with doing it the
way you suggest.

Declaring variables that you need in the right scopes is pretty straightforward. Having scopes magically continue around other separate scopes (catch scopes) doesn't look correct. I get why it's desired, but it doesn't look clean at all.

Assuming for a minute that we want some form of DIP1002, we might be able to extend the `try` scope in an interesting way:

try {
    auto f = foo();
}
catch (Exception) {
    ...
}
finally (bool ok) { // true if no exception
    bar();
    __guard (ok) f.baz();
    f.baz(); // error: f not in scope
}

Here the guard statement is a runtime check of `ok`, but it has the compile-time effect of enabling the `try` scope to be extended. Obviously this is a bit extreme if it was the only use of the guard statement, but the guard statement could be useful in other situations too (e.g. non-null code checked at compile-time).

Note that finally(bool) is more flexible than finally/else as you can interleave code arbitrarily. __guard makes it clearer something special is happening rather than just implicitly extending `try` scope in the `else` clause. Also, 'else' is not clear enough IMO.

Reply via email to