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