So that works in this situation because the outer lexpad that I want is the same as the caller's lexpad. Thanks for the tip :) After poking around a bit at what "getinterp" does I found some good reading.

 * docs/ops/core.pod - getinterp returns the ParrotInterpreter
* src/pmc/parrotinterpreter.pmc - the list of PMC keys is very interesting

Now to kick it up a notch! From that I learned that the getinterp and then lexpad works in this case since the wanted lexical pad is the caller's. This doesn't work when the wanted lexical pad is the lexically enclosing scope (not the caller). Here is an example:

# equivalent to:
#
# sub f {
#  my $x = 1;
#  return sub { my $x = $x + 1; return $x; };
# }
# print f()->(), "\n"
#
.namespace
.sub "main"
    get_global $P18, "outer"
    $P17 = $P18()
    $P16 = $P17()
    print $P16
    print "\n"
.end

.sub "outer" :outer("main")
    new $P12, "Integer"
    assign $P12, 1
    .lex "x", $P12
    get_global $P18, "inner"
    newclosure $P18, $P18
    .return ($P18)
.end

.sub "inner"  :outer("outer")
    $P0 = getinterp
    $P1 = $P0['outer'; 'lexpad']
    $P14 = $P1['x']
    n_add $P15, $P14, 1
    .lex "x", $P15
    .return ($P15)
.end

There is also the 'outer' lexpad which is the actuall enclosing one. So it looks like my complaint that there was something lacking was wrong. It is more that I didn't look enough and parrot has so much that it was hard to find :P

Thanks for the patience and the help.

Andrew Parker

On Feb 12, 2008, at 8:00 PM, Patrick R. Michaud wrote:

On Mon, Feb 11, 2008 at 10:27:27PM +0100, Andrew Parker wrote:
.namespace
.sub "outer"
   new $P12, "Integer"
   assign $P12, 1
   .lex "x", $P12
   get_global $P18, "inner"
   newclosure $P18, $P18
   $P17 = $P18()
   print $P17
   print "\n"
.end

.sub "inner"  :outer("outer")
   find_lex $P14, "x"
   n_add $P15, $P14, 1
   .lex "x", $P15
   .return ($P15)
.end

A PIR subroutine can get at its caller's lexpad by doing:

   $P0 = getinterp
   $P1 = $P0['lexpad'; 1]

So, in the 'inner' sub above, it can get to outer's 'x' lexical
by doing:

   $P0 = getinterp
   $P1 = $P0['lexpad'; 1]
   $P2 = $P1['x']

Pm

Reply via email to