On Wed, Mar 15, 2006 at 06:50:53AM +0800, Audrey Tang wrote:
> Heya.  Today I noted with delight that PGE supports interpolation of
> closures:
> 
>     $ parrot demo.pir
>     rule Foo {{ print "Hello" }}
> 
> Though the Perl 6 form is {...} instead of {{...}} -- is that intentional?

Yes, it's intentional.  PGE uses a generalized form of {{...}}
for generic closures in any target language, as mentioned by 
Larry in a post from last summer.  We're reserving { ... }
for the specific case of Perl 6 closures (where the embedded
code is parsed as Perl 6 code), but PGE allows any target 
language to be embedded in a rule by using {{ ... }}.  
Or, if the embedded closure itself needs to double braces 
for some reason, then the rule can use {{{...}}}, {{{{...}}}}, etc.,
similar to how POD handles <<<...>>>.

So, one can have

    rule myrule :lang(PIR) { <token> {{
        I0 = match
        I0 *= 2
        print I0
      }} }

and the embedded PIR "closure" will be executed after the
<token> subrule is matched.  The :lang() modifier can have
any compiler that Parrot's "compreg" instruction understands.

> We have started self-hosting Perl6 compilation, beginning with a
> self-hosting Rule engine; to construct the AST object, we use the
> "return" form recently specified in S05.pod.  Please see
> http://perlcabal.org/~gaal/peek/slide37.html for an illustration of its use.

I haven't had a chance to fully look at the change to S05, so
give me a day to look it over and I can respond more intelligently
about how quickly we can get PGE to support the changes.

> Is it possible for PGE, with its embedded code closure, support
> something like that?  For example, make a lexical symbol RETURN
> visible inside the interpolated block, which will set the result object
> and return a match success at that position?
> 
>     rule Foo {{
>          $P0 = new .Some::Tree
>          RETURN($P0)
>     }}

But in answer to your question, for :lang(PIR) PGE already
puts a nice pre-amble around the PIR code and makes the current
match state available as a "match" symbol, so it seems like
it ought to be possible to do what you're describing here.

> Pointers to where in the PGE source to hack this together would be
> appreciated. :-)

Take a look at the closure.t tests in t/compilers/pge/p6rules,
and at the PGE::Exp::Closure object at the bottom of
compilers/pge/PGE/P6Rule.pir to see how PGE is currently
handling it.

Also, I should be able to start  hanging out on #perl6
on a regular basis again, so you can ask questions of me then.
I'll make a point to be available tomorrow morning
(probably around 1500 UTC).

Thanks!

Pm


Reply via email to