Smylers wrote:
> > 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
>
> But what does a 'generic' compare do? While Perl 6 has typed variables,
> I get the impression that these are most useful for efficiency reasons
> (especially for array and hash elements), and that it'll still be common
> -- especially in simple scripts -- to continue to use Perl-5-style
> scalar variables.
>
> This very often leads to variables that contain textual representation
> of numbers. Pretty much all input from files, the keyboard, databases,
> and from a web forms comes in as text even if its source considers it to
> be numeric. Likewise, in the programmer's mind such data is numeric.
> Doing a string comparison because it currently happens to be stored as a
> string is far too confusing.
>
> The other reason for not having unary C<+> and C<~> to force numeric or
> string context is the reason that Larry gave when we were discussing the
> bitwise operators. Somebody suggested that a single operator could do
> for both numeric and character operations, using these symbols on the
> operands to resolve ambiguities.
>
> Larry rejected the idea, on the grounds that operands can be arbitrarily
> complex expressions, and that can leave the C<+> or C<~> for the left
> operand a considerable distance from the operator on which it has an
> effect.
Very well put. My solution sucks.
However, my problem remains. What does the poor generic programmer do
when he needs generic equality!? Particularly, what does
Hash(keyed => Object) use?
Maybe a method in object, or a multimethod? Called C<same> or
somesuch? Something just rings false about that :).
To outline the problem again, even disregarding user-defined objects:
Generic containers need a way to compare nums to nums and strings to
strings and only get true when they actually are equal. The kind that
the user overloads with his own user-defined type to say what it means
to be equal. No magic.
Ooh! And I came up with a good identity operator! :== (or =:= if you
like symmetry). There's a beautiful parallel with := .
$a = $b;
$a == $b; # is always true
$a := $b;
$a :== $b; # is always true
($a =:= $b; # looks a little better)
Luke