ごとけんです

In message "[ruby-dev:6661] Re: -2**2 => 4"
    on 99/04/26, EGUCHI Osamu <eguchi / shizuokanet.ne.jp> writes:
>このへんの 「気持ちよさ」 の心が知りたいです。
>
>	0-x**2 != -x**2
>
>が嫌と言う辺りなのでしょか?

僕はCで数値計算を始めたので ** に対する思い入れはありませんが、
素朴には -2**2 というものをみたとき -(2**2) だと感じたかも
しれません。というのは数学の記法では ** を右肩に乗せるという
意味だとすると -1**n == -(1**n) == -1 ですから。現状の Ruby の
-1**n の解釈とそろえるには数学の記法では (-1)**n のように括弧を
明示して、上のような混乱を避けます。

# ちなみに Mathematica では、
# In[1]:= FullForm[-x^n]
# Out[1]//FullForm= Times[-1, Power[x, n]]
# In[2]:= FullForm[-1^n]
# Out[2]//FullForm= -1
# 動作の参考にはなりませんが意味は数学記法に合わせてますね。

>私の考は(繰り返しかも知れませんが)、
>優先度は、括弧で明示できるが、負の数リテラルを言語から抹消しないと、
>-2**2 == -4 は実現できないのが、すっきりしない、と言う事です。

僕もそう思います。
またリテラル -1 が 1.@- となるのは確かに気持ち悪いとも思います。
どちらか選べと言われたら、次のような理由で -1**2 == -1 と 
-x**2 <= 0 を両立するために負の数値リテラルをなくしてしまう
ほうに一票入れます。

そもそも演算子はOOPLには不似合いなんだけど数学の記法に合わせる
ためにわざわざ導入されたわけだし、 ** をベキと読むなら
 -1**2 == -(1**2) == -1 のほうが自然です。

また、効率的には必ず単項演算が呼ばれるようになりますが、そんなに
たくさん数をプログラム中に埋め込むこともなさそうなのでそれほど
実害はないと思います。

ただ、互換性はほんのちょっとだけ気になります。ちなみに僕は言語間で
の差異を覚えるのがめんどくさいので ** を使うときは必ず括弧で明示
してます。そのためいろいろな言語での違いを知りません :-)

-- gotoken