Damian wrote:
> Debbie Pickett asked:
> > So my question is:  why two words for regular expressions, but only one
> > for subroutines?  Are "rule" and "rx" just alternate spellings, much as
> > Perl5's "for" and "foreach" are?  If so, why the two keywords?
> > If not, why not?
> They are not quite synonyms. C<rule> allows a name and an argument list
> and requires braces as delimiters:
>       rule config_line             { <ident> = \N* }
>       rule config_line ($ident)    { <$ident> = \N* }
>       $config_line = rule          { <ident> = \N* }
>       $config_line = rule ($ident) { <$ident> = \N* }
> C<rx> is purely anonymous (doesn't allow a name), doesn't allow arguments,
> but can take (nearly) any delimiters you like:
>       $config_line = rx/ <ident> = \N* /;
>       $config_line = rx{ <ident> = \N* };
>       $config_line = rx[ <ident> = \N* ];
>       $config_line = rx« <ident> = \N* »;
>       # etc.
> So the "real" name is C<rule>, and C<rx> is just a convenient short-hand.

So . . correct me if I'm wrong . . .

C<rule> allows us to define both named and anonymous rules, depending on
context.  C<rx> allows us to define only anonymous rules.  C<rule> is
the more general one, and you can use it exclusively if that's what you
feel like.

The only extra piece of syntactic sugar that C<rx> is giving us over
C<rule>[*] is the ability to have arbitrary delimiters.  If I were
satisfied with always using C<{}> as delimiters for C<rx> then a
program would run the same if I did a C<s:each/rx/rule/> on it.

Now . . .

Is there some _syntactic_ constraint (i.e., required by the parser)
that requires C<rule> to use braces for delimiters?  That is, shouldn't
the following:
  $config_line = rule ($ident) { <$ident> = \N* }
always be parseable for any given value of C<{> and C<}> (barring
obvious exceptions like colons and parentheses)?

Or, to put it more succinctly: do there exist two pieces of
*syntactically correct* code like
  ... rule ... 
and
  ... rx ...
(where the ... are identical in both) which each produce *valid* and
*different* semantics?

To me, that'd be the only reason for C<rx> and C<rule> to be different
keywords. [**]  Especially since we're making such a big deal about patterns
and subroutines having lots of parallels.  The same parallel doesn't
exist for subroutines[***]; why should it for pattern matching?

[*] Note that I'm not talking about what C<rule> gives us over C<rx>;
that's a different issue.

[**] As opposed to C<rx> and C<rule> being two different spellings of
the same keyword, something I don't object to.

[***] Notwithstanding C<< -> >>, which I now understand to be nothing
more than a different spelling of C<sub>.  See above footnote.

-- 
Debbie Pickett http://www.csse.monash.edu.au/~debbiep [EMAIL PROTECTED]
"Don't think sorry's easily said. Don't try turning tables instead. You've taken
  lots of chances before, but I ain't gonna give any more. That's how it goes,
    'cause part of me knows what you're thinking." - _Eye in the Sky_, APP

Reply via email to