I haven't written PIR in a while, and I'm not terribly familiar with the
new changes, but I'll make some guesses.

Klaas-Jan Stol writes:
> function main()
>   
>    local p = 123;   
>    local q = 345;
> 
>    foo(q);
>    foo(q);
> 
>    function foo(a) # nested function, it does have access to p in "main"
>       print(p);
>       p = p + p;
> 
>       print(typeof(a));
>       print(a);
>    end
> end
> 
> I would translate this to this PIR code:
> 
> .sub _main
>        new_pad 0
> 
>        # local p = 123
>        .local pmc p
>        p = new .PerlInt
>        p = 123
>        store_lex 0, "p", p

If I recall, store_lex 0 is meaningless, and you ought to be using
either store_lex 1 or store_lex -1.  Not too sure about this one though.

> 
>        # local q = 345
>        .local pmc q
>        q = new .PerlInt
>        q = 345
>        store_lex 0, "q", q
> 
>        newsub $P0, .Closure, _foo
> 
>        # foo(q)
>        .arg q  
>        $P0()

Shouldn't this be:

    $P0(q)

?  And likewise below?

> 
>        # foo(q)
>        .arg q
>        $P0()
> 
>        end
> .end
> 
> .sub _foo
>        .param pmc a
>       
>        # print(p);
>        find_lex $P0, "p"
>        print $P0
> 
>        # p = p + p;
>        $P0 = $P0 + $P0

I feel a little uneasy about this line.  I'm not sure how PIR interprets
this.

>        store_lex "p", $P0
> 
>        # print(typeof(a));
>        $S0 = typeof a   
>        print $S0      # ????
>       
>        # print(a);
>        print a         # ERROR!
> .end
> 
> My problem with the last 2 statements is:
> - the statement print(typeof(a)); print "SArray", which I don't understand.

I'm going to guess that that's due to your use of .arg above.

Luke

Reply via email to