[#7631] 1.3 to 1.4 — Katsuyuki Komatsu <komatsu@...>

小松です。

26 messages 1999/08/12
[#7632] Re: 1.3 to 1.4 — matz@... (Yukihiro Matsumoto) 1999/08/12

まつもと ゆきひろです

[#7634] Re: 1.3 to 1.4 — Katsuyuki Komatsu <komatsu@...> 1999/08/13

小松です。

[#7636] Re: 1.3 to 1.4 — matz@... (Yukihiro Matsumoto) 1999/08/13

まつもと ゆきひろです

[#7638] cvs HEAD (Re: Re: 1.3 to 1.4) — EGUCHI Osamu <eguchi@...> 1999/08/13

えぐち@エスアンドイーです。

[#7647] Re: cvs HEAD (Re: Re: 1.3 to 1.4) — matz@... (Yukihiro Matsumoto) 1999/08/13

まつもと ゆきひろです

[#7641] Re: [ruby-ext:00382] New coerce scheme — keiju@... (石塚圭樹)

けいじゅ@日本ラショナルソフトウェアです.

26 messages 1999/08/13

[ruby-dev:7558] NaN#<=>

From: EGUCHI Osamu <eguchi@...>
Date: 1999-08-07 19:17:30 UTC
List: ruby-dev #7558
えぐち@エスアンドイーです。

以前も話題になった、『NaN との比較の結果をどう扱うか?』
の問題ですが、現状は、、

  % ruby -ve 'nan=1.0%0; p nan <=> 1'
  ruby 1.3.7 (1999-08-06) [i386-freebsd3.2]
  -1

となります。 
Numeric#<=> のマニュアルには、

[>  self <=> other
[>    selfとotherを比較して, selfが大きい時に正,等しい時に0,
[>    小さい時に負 の整数を返します.

とあるのですが、NaN はこれのいづれにもあたりません。

この挙動が問題になるのは、 例えば Array#sort で暗黙に
Number#<=> が参照された時で、

  % ruby -ve 'p [1,9,2,1.0%0,8,3,7,4,6,5].sort'
  ruby 1.3.7 (1999-08-06) [i386-freebsd3.2]
  [1, NaN, 2, 3, 4, 5, 6, 7, 8, 9]

という、妙な結果となります。

一応、NaN の場合は整数でなく false を返す
パッチを末尾に付けましたが、この変更で、、

  % ./ruby -ve 'p [1,9,2,1.0%0,8,3,7,4,6,5].sort'
  ruby 1.3.7 (1999-08-06) [i386-freebsd3.2]
  /var/tmp//rbN23315:1:in `sort': no implicit conversion from boolean (TypeError)
	  from /var/tmp//rbN23315:1

となります。

とりあえず、false を返しましたが、
nil , self(=NaN) あたりにしても、それぞれ理由が付けられそうです。

どんなもんでしょうか?

	えぐち

Index: numeric.c
===================================================================
RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/numeric.c,v
retrieving revision 1.1.1.3.2.11
diff -u -d -r1.1.1.3.2.11 numeric.c
--- numeric.c	1999/07/15 07:59:48	1.1.1.3.2.11
+++ numeric.c	1999/08/07 13:19:06
@@ -443,7 +443,8 @@
     }
     if (a == b) return INT2FIX(0);
     if (a > b) return INT2FIX(1);
-    return INT2FIX(-1);
+    if (a < b) return INT2FIX(-1);
+    return Qfalse;
 }
 
 static VALUE

In This Thread

Prev Next