まつもと ゆきひろです

ruby-devにCCします。

In message "[ruby-math:00824] Re: -3**2 == 9 ?"
    on 03/01/03, Yukihiro Matsumoto <matz / ruby-lang.org> writes:

||ソースを見ると1.6でごちゃごちゃやってたのが1.8ではすっきりし
||てますね。いつ変更したんだっけ? うーん。
|
|分かった。1.6では"-3"を数値リテラルとして解釈してから、**の
|解析時にごちゃごちゃしてたのを"-"と"3"として解釈しておいて、
|必要に応じてコンパイル時に-3に変換するように変更したつもりで
|したが、後半だけ実装して、"-3"を数値リテラルとして解釈するの
|を止めるのを忘れてました(大ポカ)。直します。

たびたびすいません。思い出してきました。これをやると

  -1.5.floor

が

  -(1.5.floor)

と解釈されるので止めたのでした。Rubyではこういうケースの方が
「**」にくらべて登場回数がはるかに多いので。で、どうするのが
望ましいでしょうねえ。

数学的表記を考えると

  -3**2 == -9

は譲れないのだろうとは思いますが。

  - 3**2 == -9

であるので許してくれるとかはないですよね。1.6のやり方は

  "**"メソッドの呼び出しのレシーバが定数であり、かつその値が
  Fixnum, Bignum, Floatのいずれかであれば、レシーバをその値
  の符号を反転したものに取り替え、かつ全体に単項マイナス演算
  子を適用する

というかなり不自然なものなので、できれば避けたいのですが。
いや、それで構わないという意見も歓迎します。

普通の文法では単項マイナスとメソッド呼び出しのドットの優先順
位が**のせいで矛盾するということのようです。