Actually Perl 6 is even harder to (statically) parse than Perl 5, because it is much easier to change the syntax.
You can, for example, introduce new operators very easily:
multi sub prefix:<foo> (Str $a) {
return $a eq "foo" ?? "bar" !! "foo";
}
This will define an unary prefix operator that takes one string as an argument. When somebody writes
foo "foo";
You can't know if that's a method call or a call to an operator. You'd think it makes no difference - but wait until precedence comes into the play:
BEGIN {
eval
"
multi * prefix:<foo> (Str $a) is tighter(&infix:<~>) {
return $a eq 'foo' ?? 'bar' !! 'foo';
";
}
# and later in the code:
foo "fo" ~ "o";
If that foo parsed as a sub call the precedence is lower than that of the concatenation ~, and the other way round if it's parsed as an operator.
This is quite a complicated example, but there are much easier ones with "real" macros. (But since no implemenation really implements macros by now, I don't really know much about them). |