digitalmars.D - Re: Regurgitated proposal: Make loop conditions part of the body's scope
- Robert Fraser <fraserofthenight gmail.com> Aug 01 2007
downs Wrote:I realize this has been requested before, by me and a few others, gained the votes of a significant amount of people here, been completely ignored by Walter (no offense meant, I know he can't read every proposal), you know how it goes. The reason I'm bringing it up again is that it could potentially, and implicitly, help (or even completely) fix a quite serious bug I discovered this morning. To recap: the proposal is to make the parameter ("()") part of some common constructs such as while, do/while and with (I'll get to that in a second) part of the scope of the actual loop body - this would allow, for instance, checking the value of an inner variable in the condition of a do/while loop. Disadvantages: it breaks compatibility with C++ in cases which are forbidden anyway (shadowing declarations). .. That's all I can think of. As far as I know, it doesn't change the behavior of existing code. Now, for the bug. Consider the following example program. scope class test { this() { writefln("this"); } ~this() { writefln("~this"); } } void main() { writefln("Pre"); with (new test) { writefln("Inside With"); } writefln("Post"); } What would be expected: Pre this Inside With ~this Post. What happens: Pre This Inside With Post ~this. Okay, I thought, so the new test is in the outside scope. Sucks, but workable. I changed it to { with (new test) { writefln("Inside With"); } } ... I got the same results. Turns out constructing an instance of a scoped class as the parameter of a with construct makes the compiler COMPLETELY ignore the scope. And I can't help thinking, if the with loop's parameters were part of the inner scope, that bug _probably_ wouldn't have happened. Which is why I'm holding off on a bug report until there's some feedback on what the compiler should do in this situation. With greetings and stuffies, --downs
This is something I've been secretly lusting for for a while (in Java). I especially hate having to declare _and initialize_ do/while conditions outside the loop. do { String line = reader.nextLine(); [...] } while(null != line); ... is much prettier than... String line = null; do { line = reader.nextLine(); [...] } while(null != line); Of course, you don't need the initializer in D, but it still requires variables be declared outside the scope.So this gets my vote. You should still file a bug about the with statement thing anyway.
Aug 01 2007