I'm reordering this post rather than retype stuff. Forgive me.

--- Uri Guttman <[EMAIL PROTECTED]> wrote:

> for the p6 regex impaired among us, please explain that. it might
> make a nice tute for the docs. i get the general picture but i don't
> follow how it works regarding the color checking.

Of course, the color checking is the part that I messed up. See below.

> >>>>> "AH" == Austin Hastings <[EMAIL PROTECTED]> writes:
> 

Disclaimer: I'm *SO* clueless about this stuff...

>   AH> grammar Rainbow;
> 
>   AH> rule color {...};  # this one's on you.

Yary posited a color class, so I accept that he can recognize them. I
called it Colorific, just because. So my first mistake was probably
failure-to-declare:

grammar Rainbow;
use Colorific;  # Import C<rule color;> and C<new>, among others.

What I don't know is how to recognize a color, which is to say I don't
know how to write the <color> rule -- because I don't know what this is
being applied to. Is this reading pixels, interpreting the results of
radio telescopy, or consuming Lucky Charms breakfast cereal bits? I
don't know, so I'm just going to assume that Yary can write that for me
-- it's his class, after all.

And the Colorific class supposedly has a way to determine if two colors
look about like each other. Again, I don't know how that works, but I
don't need to.

>   AH> rule same_color($color is Colorific)
>   AH> {
>   AH>   <color> ::: { fail unless $1.looks_like($color); }
>   AH> }

This is really probably bad code. Maybe a better rule would be:

rule same_color($color is Colorific)
{
  <color> ::: { fail unless $color.looks_like($1); }
}

I KNOW that $color is an object-of-type-Colorific, while I'm not sure,
frankly, what <color> is returning. Let Colorific handle that.

Also, please note that the only reason that C<same_color> is a separate
rule is because I haven't learned, yet, how to do that in one amazing
line of P6 code. I suspect that it could have been written all inside
the C<band> rule, if I were smarter.

>   AH> rule band($color is Colorific)
>   AH> {
>   AH>   <same_color($color)>+
>   AH> }

Here, I'm just saying that a 'band' of the rainbow is made up of
at-least-one-maybe-more bit of a color that looks like $color. 

So, for a "color band" of, say, red, I'll take red and require that
there be a bunch of stuff that looks like red, using the same_color
rule (that, in turn, uses the Colorific::looks_like function, which
someone else wrote).

But that's the key: once I know how to recognize a band of color, I can
look up my old ROY G. BIV mnemonic from Astronomy (or what that
electronics? Too many dead brain cells:- I apologize if my rainbow is
actually a RadioShack-bow.)

So I need to declare what a Rainbow looks like. I'll use my band
"shortcut" to specify the seven different colors.

Note that rexen / rules are declarative, not imperative. The lines are
each pattern-invocations, and there aren't any semicolons. If I want
procedural, I need to open a sub-block to drop into "perl command
mode", like I did in the C<same_color> rule, above.

Since there's no alternation(|) or grouping or anything here, these
declarations are straight-line: they all apply, one after the other.

So a Rainbow is recognized when there's a
band-of-red followed immediately by a 
band-of-orange followed immediately by a 
...
band-of-violet. 
Then, if you're lucky, there might be a pot-o-gold at the end. :-)

rule pot_o_gold {
  $lucky := <leprechaun>   # You *DO* know how to catch a Leprechaun,
                           # don't you?
  { 
    if (trick($lucky)) {
       print "Begorrah! I'm rich!";
    } else {
       print "Always after me Lucky Charms ...";
    }
  }
}

}
>   AH> rule Rainbow
>   AH> {
>   AH>   <band(new Color("red"))>
>   AH>   <band(new Color("orange"))>
>   AH>   <band(new Color("yellow"))>
>   AH>   <band(new Color("green"))>
>   AH>   <band(new Color("blue"))>
>   AH>   <band(new Color("indigo"))>
>   AH>   <band(new Color("violet"))>
>   AH>   <pot_o_gold>?
>   AH> }

This really is bad code on my part. s/Color/Colorific/, please. 

rule Rainbow
{
   <band(new Colorific("red"))>
   <band(new Colorific("orange"))>
   <band(new Colorific("yellow"))>
   <band(new Colorific("green"))>
   <band(new Colorific("blue"))>
   <band(new Colorific("indigo"))>
   <band(new Colorific("violet"))>
   <pot_o_gold>?
}

> 
> for the p6 regex impaired among us, please explain that. it might
> make a
> nice tute for the docs. i get the general picture but i don't follow
> how
> it works regarding the color checking.


Reply via email to