> Luke Palmer:
> # The first thing I noticed was the == / eq distinction. This
> # has been invaluable for scripting, but since Perl 6 is
> # desiring to be more of a formal language, I'm wondering
> # whether the distinction is profitable. In generic programming
> # (my specialty :), it is very useful to have a standard sort
> # of equality[*] that all participating objects define.
>
> Your desired "standard sort of equality" is provided by smartmatch.
>
> $a ~~ $b
Don't get too hasty here, I actually did put some thought into this.
Smart match was not what I was thinking of. I don't think two hashes
should be considered equal if their key intersection is nonempty.
> # The solution that springs to mind is to conform to other
> # languages' thought and make == polymorphically compare
> # equality. Thanks to context-forcing, the string/numeric
> # distinction is still there, at the expense of a little extra
> # verbosity:
> #
> # +$a == +$b; # Numeric compare
> # ~$a == ~$b; # String compare
> # $a == $b; # Generic compare
>
> Conciseness and precision are lost. What's gained?
I<One> solitary equality operator. Remember, I'm considering this
from a generic programmer's point of view. I'm already aware that the
== eq distinction is useful for scripting.
class Map {
method insert(Pair $p) {
push @.elems: $p;
}
method get($key) {
for (@.elems) { return $_.value if $_.key == $key }
}
has Pair @.elems;
}
Or should that have been C<$_.key eq $key>? It certainly shouldn't have
been ~~ (lest this work:)
my Map $map;
my @array = (1..5);
my @other = (4..12);
$map.insert(@array => 1);
$map.get(@other); # Returns 1 !!!
Whatever the array equality operator is, it sure isn't that! :)
Do you see the problem now? If I use ==, then I get length
comparison. If I use eq, then I get string comparison (which,
depending on the elements' types, may not be correct).
Map was just a coded example of what Hash has to do if it doesn't want
to be keyed by strings (and that option is given in Perl 6).
Luke