[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: New scoping rule for "repeat" and "continue" patch
- From: David Given <dg@...>
- Date: Tue, 4 Oct 2005 10:32:23 +0100
On Tuesday 04 October 2005 06:46, Diego Nehab wrote:
> Sorry, I was away and missed this nice thread. I feel guilty because I
> bothered Roberto some time ago with this change, so now it is my dutty
> to defend it. :)
I have to admit that I don't actually like this; I think it violates the
Principle of Least Astonishment. I wouldn't *expect* the 'until' to be in the
scope of the block inside, because (a) that's not how other Algol-ish
languages do it, and (b) it's not visually part of the block.
However, to move on and actually answer the question:
> local done
> local l = io.read"*l" or "quit"
> if l:match"^#" then continue end
> local g, rest = l:match"(%S+)%s*(.*)"
> done = handle[g](g, words(rest))
> until done
> If you assume the old scoping rule and use the above declaration, you
> will still skip assignment to "done". Will Lua detect such a problem?
> Does this loop not work the same as the other? I might be just tired.
Execution will, however, pass through the 'local' statement that does an
implicit assignment of nil (IIRC). Allowing jumps to the middle of a block
(which continue would do using this scoping scheme) would bypass this. I
don't believe that this is currently a problem, there would be issues with
an optimising compiler that tried to reuse registers would have issues ---
done would end up with an undefined value, depending on what had previously
been in the register.
+- David Given --McQ-+ "It's the dawn of the day before the time of the
| firstname.lastname@example.org | land that the lost dinosaurs forgot to remember!"
| (email@example.com) | --- Ookla the Mok
+- www.cowlark.com --+
Description: PGP signature