Dave Mitchell wrote:
> The whole point is that closed variables *aren't* 'just local variables'.
> The inner $x's in the following 2 lines are vastly different:
> 
> sub foo { my $x= ...     { $x } ....}
> sub foo { my $x= ... sub { $x } ....}

You really need to learn what a closure is. There's a very nice book
called "Structure and Interpretation of Computer Programs" that can
give you a deep understanding. **

Anyways, it's important to understand that closures do not change the
scoping rules. A closure simply *captures* an existing environment.
If the environment isn't captured properly or changes after capture,
then you have buggy closures.

> causes the behaviour to change is that the middle $x implicitly gives
> foo() a copy of $x at compile time. When the anon sub is cloned,
> it picks up the current value of foo()'s $x. Without the middle $x, the
> cloned sub picks up the outer $x instead.

You're speaking in Perl implementation terms. I've already told you
that if Perl acts the way you say it does, then Perl has buggy
closures. You don't need to explain a bug to know that one exists!

On page 260 in "Programming Perl" (3rd ed), Larry/Tom/Jon talk about
how Perl's closures (should) behave:

  In other words, you are guaranteed to get the same copy of
  a lexical variable each time ...

IMHO bugs in Perl 5 shouldn't carry over to Perl 6. (Unless, of course,
we *like* the bugs... ;)

- Ken

** Unfortunately the term closure has two important meanings that
are not really related. We're talking about closing a subroutine's
environment, which is not how SICP uses the word. If you want a
"Closures For 21 Dummies" sort of book, this is not it.

Reply via email to