Joel VanderWerf wrote:
> Yukihiro Matsumoto wrote:
>> Hi,
>>
>> In message "Re: [ ruby-Bugs-6468 ] the sign of a number is omitted
>> when squaring it. -2**2 vs (-2)**2"
>>     on Sun, 5 Nov 2006 04:23:30 +0900, Joel VanderWerf
>> <vjoel / path.berkeley.edu> writes:
>>
>> |Any yet
>> |
>> |irb(main):002:0> -2.abs
>> |=> 2
>> |
>> |So there are cases where the operation of "concatenating characters
>> to |form a literal" has higher priority than an operation on objects.
>>
>> People with mathematical background demands precedence for ** being
>> higher than that of unary minus.  That's the reason.
> 
> Precedence isn't the whole story:
> 
> irb(main):001:0> x=2
> => 2
> irb(main):002:0> -x**2
> => -4
> irb(main):003:0> -2**2
> => -4
> irb(main):004:0> -x.abs
> => -2
> irb(main):005:0> -2.abs
> => 2
> 
> Tokenization works differently in different contexts (as it should).
> Mathematicians need to learn this, when they read line 005 above.
> 

I think I want to weigh in here as a mathematician and long-time
scientific programmer. My view is that is the *programmer's*
*responsibility* *alone* to code mathematical formulas in a manner such
that they are unambiguous, both to the compiler or interpreter, and to
the readers of the code. Therefore, the correct code is either

(-x)**2

or

-(x**2)

depending on which meaning the programmer intended. And I can't for the
life of me understand why anyone would code

(-x).abs