And the root of that is that Perl 5 chooses to determine the operation by the verb (operator) instead of the type of the subjects, which is conveniently hidden behind the "scalar" which can be an integer, float, string or reference.
For example Javascript overloads + to mean either concatenation or addition, based on the type of the left operand, which forces people to write explicit coercions just to be save, ie 0 + a + b or '' + a + b. In Perl 5 that would just be $a + $b vs $a . $b. The same goes for the comparison operations: the operator determines the type of operation.
| [reply] [Watch: Dir/Any] [d/l] [select] |
Yes, overloading + to mean either string concatenation or numeric addition is a language design blunder IMHO. I'm often saddened by how many language designers were seduced by this unfortunate misfeature.
It explains why, for instance, you so often need ugly
explicit coercion via the int function in
Python and the to_i method in Ruby.
The elegant dividend that Perl derives from its lack of
operator ambiguity is clearly and tastefully described in Modern Perl in the "Numeric, String, and Boolean Context" section on page eight:
In exchange for not having to declare (or at least track)
explicitly what type of data a variable contains or
a function produces, Perl offers specific type contexts
that tell the compiler how to treat a given value during
an operation ...
The eq operator treats its operands as strings by
enforcing string context on them.
The == operator imposes numeric context ...
Perl will do its best to coerce values to the proper type
depending on the operators you use. Be sure to use the
proper operator for the type of context you want.
| [reply] [Watch: Dir/Any] [d/l] [select] |
The elegant dividend that Perl derives from its lack of operator ambiguity
Hm. If only that notion had been carried through to other operators like the bitwise boolean operators where it is all to frequent that you need to enforce the context by explicit coercions.
Not a big criticism, but it still catches me out occasionally.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
| [reply] [Watch: Dir/Any] |
The elegant dividend that Perl derives from its lack of operator ambiguity
Really? Can you describe what &, |, ++ and <> do, without taking the value of their operands into account?
Yes, overloading + to mean either string concatenation or numeric addition is a language design blunder IMHO. I'm often saddened by how many language designers were seduced by this unfortunate misfeature.
I don't call it a misfeature. It's a design decision whether you allow multiple dispatch or not. There are pro and cons, and judgement should be made in context of the entire language. If your typing system is different, multiple dispatch makes more sense (perl6 will have multiple dispatch, although I don't know whether it will have it for build in operators). Perl5 doesn't have much of it, but do note the mentioned operators. And it allows operators to be overloaded. If I want to make + to concatenate strings, I can, quite simply:
use 5.010;
use overload '""' => sub {${$_[0]}},
'+' => sub {bless\do{my$o=${$_[$_[2]]}.$_[1-$_[2]]}};
BEGIN {overload::constant q => sub {bless \do {my $v = $_[0]}}}
my $x = "Hello";
my $y = "world";
my $z = "" + uc $x;
say $x + ", " + $y;
say $z + $z;
__END__
Hello, world
HELLOHELLO
(Implementation not complete) | [reply] [Watch: Dir/Any] [d/l] [select] |