Abhijit A. Mahabal writes:
> As I try writing P6 programs I do find myself needing required named
> params, and I thought I'd like something like ++$named_req for myself as a
> shorthand for "+$named_req is required" or whatever is decided.
> 
> Now, larry often says (only partly jokingly) "go write your own grammar".
> But I do not know how I'd change/modify/append the grammar to accomodate
> that cosmetic change above. Needing to know "the entire P6 grammar"
> isn't mouth watering. I am sure this has been discussed before, so can
> somebody please point me to some place where I can start reading about
> this?

Well, there's no official grammar for Perl 6 anywhere.  The most
definitive source you can find is in A6.  In that document we find:

    rule parameter :w {
        [ <type>? <zone>? <variable> <trait>* <defval>?
        | \[ <signature> \]   # treat a single array ref as an arg list
        ]
    }

    rule zone {
        [ \?   # optional positional
        | \*   # slurpy array or hash (or scalar)
        | \+   # optional named-only
        ]
    }

It would seem that this is the place to create your ++ zone.  Here we
go:

    grammar Grammar::ReqNamed {
        is Grammar::Perl;

        rule zone {
              \+ <before: \+> { 
                .substr(.pos, 1) = '';
                s/<after: <variable>>/is required/;
                fail;
              }
            | <next>
        }
    }

That probably doesn't work.  But it gets close.  I'd much prefer to
parse it and then change the syntax tree in the walking phase, but I
don't know how to do that yet.

Luke

Reply via email to