On Sat, 9 Aug 2003, Sean O'Rourke wrote:

> Remember, the pad depth reflects lexical scope nesting,
> not dynamic scoping.  So if you mean "current_depth" as
> "current compile-time depth" above, then you're right,
> but the VM would have no way to tell.  If you mean
> run-time depth, which the compiler could know
> about... A top-level sub should not create a new pad at
> depth + 1, since that would put it inside its caller's
> lexical scope, which would just be weird.

Okay, I definitely need some help understanding this.

Here's some python code that defines a closure:

            def make_adder(base):
                def adder(x):
                    return base+x
                return adder
            h = make_adder(10)
            print h(5)

When I run this in python 2.2, it prints "15".

When I run it through pirate, I get this:

   -scratch_pad: too deep

Now, in my mind:

    depth 0 has: make_adder, h
    depth 1 has: base, adder
    depth 2 has: x

The top level .sub should start with 'new_pad 0'
The make_adder .pcc_sub should start with 'new_pad 1'
The adder .pcc_sub should start with 'new_pad 2'

I think the error happens  because I'm calling a depth 2 
function from depth 0, but if I change adder's new_pad 
depth to 1, it can't find "base".

I don't know how to get this to work the way I want.
Can anyone help me out here?

(Generated code follows - note the "GETS HERE" line)

Sincerely,
 
Michal J Wallace
Sabren Enterprises, Inc.
-------------------------------------
contact: [EMAIL PROTECTED]
hosting: http://www.cornerhost.com/
my site: http://www.withoutane.com/
--------------------------------------

.sub __main__
    new_pad 0
    setline 2
    newsub $P0, .Sub, _sub0
    store_lex -1, 'make_adder', $P0
    .local object h
    .local object arg0
    arg0 = new PerlInt
    arg0 = 10
    find_lex $P5, 'make_adder'
    newsub $P6, .Continuation, ret0
    .pcc_begin non_prototyped
    .arg arg0
    .pcc_call $P5, $P6
ret0:
    .result h
    .pcc_end
    store_lex -1, 'h', h
    .local object arg1
    arg1 = new PerlInt
    arg1 = 5
    find_lex $P8, 'h'
    newsub $P9, .Continuation, ret1
    .pcc_begin non_prototyped
    .arg arg1
    .pcc_call $P8, $P9
ret1:
    .result $P7
    .pcc_end
    .arg $P7
    call __py__print
    print "\n"
    end
.end
.include 'pirate.imc'


# make_adder from line 2
.pcc_sub _sub0 non_prototyped
    .param object base
    new_pad 1
    store_lex -1, 'base', base
    setline 3
    newsub $P1, .Sub, _sub1
    store_lex -1, 'adder', $P1
    .local object res1
    find_lex res1, 'adder'

    pop_pad
    .pcc_begin_return
    .return res1
    .pcc_end_return
.end

# adder from line 3
.pcc_sub _sub1 non_prototyped
    print "GETS HERE!\n"       ########
    new_pad 2
    print "WON'T GET HERE!\n"  ########
    .param object x
    store_lex -1, 'x', x
    .local object res0
    find_lex $P2, 'base'
    find_lex $P3, 'x'
    $P4 = new PerlUndef
    $P4 = $P2 + $P3
    res0 = $P4

    pop_pad
    .pcc_begin_return
    .return res0
    .pcc_end_return
.end


Reply via email to