The table of smart matches in S4 has this: ... Any Str string equality match if $_ eq $x ... Any Rule pattern match match if $_ ~~ /$x/ ...
By my (and Damian's) interpretation of the table, this means that "string" ~~ /rule/ would be interpreted as testing the *string equality* of its operands, rather than doing a pattern match. Clearly this is not the intention. Am I misreading the table, or is there a mistake? If the latter, what is the correct precedence order of the table entries? The other thing that seems odd to me is that $foo ~~ $bar where $foo and $bar are both references to Code<>, is defined to be equal to (the truth value of) $bar(). This seems an unnecessary violation of commutativity. For Perl 5, I changed the relevant part of the table to read Any undef undefined match if !defined $a Any Regex pattern match match if $a =~ /$b/ Code() Code() results are equal match if $a->() eq $b->() Any Code() simple closure truth match if $b->() (ignoring $a) Num numish[!] numeric equality match if $a == $b Any Str string equality match if $a eq $b Any Num numeric equality match if $a == $b which retains commutativity in all cases. Of course it's different in Perl 6, because the "dotted entries" like .[number] and .method need to behave non-commutatively. But is it really necessary for coderefs? Is my implementation sufficiently in the spirit of the Perl 6 design? Thanks for your thoughts. Robin