On Sat, Jul 12, 2008 at 12:30:02AM -0400, Bob Rogers wrote:
> ... But, as I quoted you:
>
> . . . if cloning works the same as newclosure than we don't need
> an explicit newclosure . . .
>
> Which seems to say something entirely different. So I thought I should
> point out that cloning does *not* work the same as newclosure.
Okay, now I understand where you were coming from. I should have said
"... in the new scheme, cloning the (already-bound) inner closures will
have the same effect that newclosure does now. Since assignment already
makes a copy (clone), we won't need an explicit newclosure."
> (And I still don't understand the *point* of cloning a closure.)
Short answer: cloning is what will enable the following to work:
for 1..10 -> $x {
sub foo() { say $x; }
push(@foos, &foo);
}
Longer answer: Assume under my proposal that we don't have
(or need) a newclosure opcode. Here's how things work: In the
above for loop, every time we execute the body of the loop, a
capture operation is performed on foo to give it the current
variable bindings. We don't get a new object for foo, we
just take the existing one and bind it to the new lexical
environment (losing any bindings we might have had from a
previous capture of foo).
In the push statement, however, we want to store a copy
of foo as it's currently bound. Thus we simply do a clone
of the current foo, which creates a copy (including its
current bindings) and stores it in the @foos array.
The & in &foo is what cues us to know that we need to
a clone, because we're using a closure in an rvalue context.
At the start of the next iteration of the for loop, we
again perform a capture on the foo sub to bind it to the
new lexical environment, However, this doesn't affect the
cloned copy that we saved in the previous iteration -- that
copy is still bound to the lexical environment of the previous
iteration. Which is exactly what we want.
Hope this helps. As I mentioned in my reply to chromatic
a few minutes ago, I have a *lot* more to add about this,
but it will take me a few hours to write it all up clearly.
Stay tuned.
Pm