"9" + 2 # ==> 11
"9" ++ 2 # ==> "92"
Yeah, that just doesn't make things better "9" + 2 # ==> 11
"9" ++ 2 # ==> "92"
Yeah, that just doesn't make things betterIf + is to be defined on a string and a number then the only sensible meaning is string concatenation. All numbers can be converted to strings but most strings cannot be converted to numbers.
There is a good reason to not define it because it is not associative: in JavaScript 2+2+"x" != 2+(2+"x")
The same result as `convert_to_number("badger") + convert_to_number(2)`. In Z it seems that converting an invalid string to number yields NaN, so "badger" + 2 returns NaN.
> There is a good reason to not define it because it is not associative: in JavaScript 2+2+"x" != 2+(2+"x")
The problem with + not being associative in JavaScript is because it's actually two different operators: String concatenation and number addition. Z doesn't have this problem because + is only number addition.
Personally I prefer strong typing (and thus `string + number` throwing an error and/or being a compile-time error), but it seems like the way Z does coercing is very sensible and doesn't have the same issues as JavaScript.
++ is for concatenation.
+ is for arithmetic.
Coercion or not, it's always puzzled me when languages used the same symbol.
I guess they're both associative and have identity values, but that's about it. One is commutative, the other is not.
* makes about as much sense for concatenation as +.