OUTER::<$varname> (S06, "Out-of-scope names")
$OUTER::varname (S02, "Names")

specifies the $varname declared in the lexical scope surrounding the current 
lexical scope (i.e. the scope in which the current block was defined).


sub outersub ()
 {
 my $a;
 my $b;
 my $closure = sub {
    say $a;  # OK, that's what closures do.
        say $OUTER::a;  # same thing
        say $OUTER::("b");  # symbolic reference
    }
 my &Pascalishsub := sub ($cl)
  {
  $cl();  # CALL 2
  }
 $closure();  # CALL 1
 Pascalishsub($closure);  # prelude to CALL 2
 return $closure;  # prelude to CALL 3
 }

my $cl = outersub;
$cl();  # CALL 3


What happens?  The OUTER scope no longer exists at CALL 3.  Does a symbolic 
reference to OUTER require that the entire scope be retained, just in case?  If 
"OUTER" itself (or OUTER::OUTER::...) is symbolic, it would need to remember 
everything always, just in case.

Yet in CALL 1, the use of OUTER makes sense, and is a normal use.  This 
situation should be allowed, or you'll have a hard time describing exactly when 
OUTER may be used symbolically, since the simple description now is that all 
blocks are closures, but most can be optomized down.

Now look at CALL 2.  The situation is similar in that the outer scope still 
exists, but it is much harder for OUTER to figure out where to look.  Does this 
work?  If not, again, its hard to explain just when it should or shouldn't, 
because cases that do are just automatic degenerate forms of "every block is a 
closure".

--John

Reply via email to