I've just applied a change (r11921) to PGE that allows embedded closures in rules to designate a "return value" for a match (recently added to S05).
Essentially this means that a rule such as /:lang(PIR) foo {{ .return "bar" }} / will match a string containing "foo" but gives the returned match object a value of "bar". We can also do things such as /:lang(PIR) \d+ {{ # return 200 more than matched $I0 = match $I0 += 200 .return ($I0) }} / /:lang(PIR) <moose> {{ $P0 = match["moose"] # get subpattern match $P1 = "Moose_new"($P0) # create a new Moose object from it .return ($P0) }} / # and return that as the Match value To obtain the return value of a Match object, use the value() method: match = rule(string) # match string against rule $P0 = match.value() If a match object doesn't have an explicit return value, then its value is the substring that it matched. There are some small examples in t/compilers/pge/p6rules/closure.t . Comments, questions and tests welcomed. Pm