[ruby-trunk - Feature #5512][Open] Integer#/ の改訂

Issue #5512 has been reported by tadayoshi funaba.


Feature #5512: Integer#/ の改訂

Author: tadayoshi funaba
Status: Open
Priority: Normal
Assignee:
Category:
Target version: 2.0

Integer#/ を Integer#quo の別名として定義しなおす事を提案します。

現在の Integer#/ はオペランドが整数である場合値が整数になります。整数を
与えた場合の結果だけを見て、あるいは整数ではない場合の結果だけを見て自
分の望み通りの結果を得たと思い込んでしまうかもしれません。

これついての対処として、Integer#div、または Integer#quo を利用するよう
啓蒙するなどいくつかの提案がありうるでしょうが、本質的な解決法は、やは
り仕様を変更するしかないと思われます。

これはプログラミングにおける総称性の確保の邪魔になり、Numeric#/ を利用
はバグの温床になり得えます。

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:44707] [ruby-trunk - Feature #5512][Open]
Integer#/ $B$N2~D{(B”
on Sun, 30 Oct 2011 17:19:45 +0900, tadayoshi funaba
[email protected] writes:

|Integer#/ $B$r(B Integer#quo $B$NJLL>$H$7$FDj5A$7$J$*$9;v$rDs0F$7$^$9!#(B

$BD94|E*$K$O;?@.$7$^$9$,!“(B2.0$B$K$O$”$^$j2a5n$H$NHs8_49@-$rF~$l(B
$B$?$/$J$$$N$G!"$=$N<!(B(3.0?)$B$K$7$h$&$H;W$$$^$9!#(B

(2011.11.01 03:45 ), Yukihiro M. wrote:

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:44707] [ruby-trunk - Feature #5512][Open] Integer#/
$B$N2~D{(B”
on Sun, 30 Oct 2011 17:19:45 +0900, tadayoshi funaba [email protected]
writes:

|Integer#/ $B$r(B Integer#quo $B$NJLL>$H$7$FDj5A$7$J$*$9;v$rDs0F$7$^$9!#(B

$BD94|E*$K$O;?@.$7$^$9$,!“(B2.0$B$K$O$”$^$j2a5n$H$NHs8_49@-$rF~$l(B
$B$?$/$J$$$N$G!"$=$N<!(B(3.0?)$B$K$7$h$&$H;W$$$^$9!#(B

2.0 $B$,%j%j!<%9$5$l$?$i(B trunk $B$G<BAu$G$-$k$H2r<a$7$FNI$$$G$9$+!)(B
$B$=$l$H$b!"(B2.0 $B$N%j%j!<%98e$K$b$&0lEY9M$($^$9$+!)(B

$B1sF#$G$9!#(B

2011$BG/(B11$B7n(B1$BF|(B3:45 Yukihiro M. [email protected]:

In message “Re: [ruby-dev:44707] [ruby-trunk - Feature #5512][Open] Integer#/
$B$N2~D{(B”
on Sun, 30 Oct 2011 17:19:45 +0900, tadayoshi funaba [email protected]
writes:

|Integer#/ $B$r(B Integer#quo $B$NJLL>$H$7$FDj5A$7$J$*$9;v$rDs0F$7$^$9!#(B

$BD94|E*$K$O;?@.$7$^$9$,!“(B2.0$B$K$O$”$^$j2a5n$H$NHs8_49@-$rF~$l(B
$B$?$/$J$$$N$G!"$=$N<!(B(3.0?)$B$K$7$h$&$H;W$$$^$9!#(B

$BK\5$$GJQ$($kM=Dj$,$“$k$N$J$i!“FCBg$NHs8_49$K$J$j$^$9$N$G!”:#$N$&$A$K(B
$B@Z$j<N$F$?$$>l9g$N?d>)BeBX:v$r7h$a$F(B ( (x/y).round $B$G$9$+$M!)(B)
$B!”(B
2.0
$B$+$i7<LX$7$F$*$$$?$[$&$,$$$$$H;W$$$^$9!#(B($B$D$^$j?d>)7A<0$K$J$C$F(B
$B$$$J$$>l9g$K(B warning $B$r=P$9(B)

$B8D?ME*$K$O!“(BInteger#// $B$H$+JL$N1i;;;R$rF3F~$7$F!”(BInteger#/
$B$OJQ$($J$$(B
$BJ}$,4r$7$$$G$9!#@Z$j<N$F$r4|BT$7$?%3!<%I$r$9$4$/=q$$$F$-$?!#!#!#(B

$BK\5$$GJQ$($kM=Dj$,$"$k$N$J$i!“FCBg$NHs8_49$K$J$j$^$9$N$G!”:#$N$&$A$K(B
$B@Z$j<N$F$?$$>l9g$N?d>)BeBX:v$r7h$a$F(B ( (x/y).round $B$G$9$+$M!)(B) $B!"(B
2.0 $B$+$i7<LX$7$F$*$$$?$[$&$,$$$$$H;W$$$^$9!#(B($B$D$^$j?d>)7A<0$K$J$C$F(B
$B$$$J$$>l9g$K(B warning $B$r=P$9(B)

$B$=$l$O;?@.$G$9!#$3$l$^$G$N;v$r9M$($k$H$"$^$j4|BT$G$-$J$$$G$9$,!#(B
python2 $B$G$d$C$?$h$&$J;v$G$9$,!"(Bruby $B$@$H(B div
$B$r$D$+$($C$F$/$i$$$G$7$g(B
$B$&!#(B

$B8D?ME*$K$O!"(BInteger#// $B$H$+JL$N1i;;;R$rF3F~$7$F!"(BInteger#/
$B$OJQ$($J$$(B
$BJ}$,4r$7$$$G$9!#@Z$j<N$F$r4|BT$7$?%3!<%I$r$9$4$/=q$$$F$-$?!#!#!#(B

smalltalk $B$G$O!"(B// $B$,@Z<N$F(B \
$B$,$=$l$NBP$K$J$kM>$j$J$C$F$$$^$9$,!"(B
ruby $B$G$O(B //
$B$O@55,I=8=$KHo$k$N$G%@%a$@$H8@$o$l$^$7$?!#$I$C$A$K$7$F$b(B
Integer#/ $B$rJQ$($k;v$K0UL#$,$"$k$N$G!"$=$l$@$C$?$i!"(Bdiv $B$H(B quo
$B$r$D$+$$(B
$B$^$7$g$&$G=*$j$G$9$M!#8e$O$D$+$$$d$9$$$h$&$K(B div
$B%a%=%C%I$G$O$J$/!"(Bdiv
$B1i;;;R$rMQ0U$9$k$/$i$$$+!#(B

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:44765] Re: [ruby-trunk - Feature #5512][Open]
Integer#/ $B$N2~D{(B”
on Tue, 1 Nov 2011 22:12:54 +0900, Yusuke E. [email protected]
writes:

|$BK\5$$GJQ$($kM=Dj$,$“$k$N$J$i!“FCBg$NHs8_49$K$J$j$^$9$N$G!”:#$N$&$A$K(B
|$B@Z$j<N$F$?$$>l9g$N?d>)BeBX:v$r7h$a$F(B ( (x/y).round $B$G$9$+$M!)(B) $B!”(B
|2.0 $B$+$i7<LX$7$F$*$$$?$[$&$,$$$$$H;W$$$^$9!#(B($B$D$^$j?d>)7A<0$K$J$C$F(B
|$B$$$J$$>l9g$K(B warning $B$r=P$9(B)

$BJ}?K$H$7$F$O;?@.$G$9$,!"!V?d>)7A<0$K$J$C$F$$$J$$!W$3$H$r$I$&(B
$B$d$C$F8!=P$7$^$9$+!)(B Integer#/ $B$,8F$P$l$kEY$K7Y9p$r=P$9!)(B

|$B8D?ME*$K$O!“(BInteger#// $B$H$+JL$N1i;;;R$rF3F~$7$F!”(BInteger#/ $B$OJQ$($J$$(B
|$BJ}$,4r$7$$$G$9!#@Z$j<N$F$r4|BT$7$?%3!<%I$r$9$4$/=q$$$F$-$?!#!#!#(B

$BJL$N1i;;;R$H$$$&0UL#$G$O(B quo $B$,$“$k$N$G!”!VJQ$($J$$!W$H$$$&(B
$B$N$O$3$NDs0F$N0UL#$,$J$/$J$k$N$G$O$J$$$G$7$g$&$+!#$^$?!“@0?t(B
$B$,MW5a$5$l$k$H$3$m$G$O$[$H$s$I$N>l9g@Z$j<N$F$,9T$o$l$F$$$k$O(B
$B$:$J$N$G!”<B:]$K$O$“$^$jLdBj$K$J$i$J$$$3$H$,B?$$$+$b$7$l$^$;(B
$B$s!#$D$^$j!”(B

p 1/2

$B$_$?$$$N$O1F6A$r<u$1$k$1$I(B

ary[1/2]

$B$_$?$$$N$O1F6A$r<u$1$J$$$C$F$3$H!#(B

                            $B$^$D$b$H(B $B$f$-$R$m(B /:|)

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:44768] Re: [ruby-trunk - Feature #5512][Open]
Integer#/ $B$N2~D{(B”
on Tue, 1 Nov 2011 23:40:20 +0900, Yusuke E. [email protected]
writes:

|x $B$r(B n $B$NG?t$K%"%i%$%s$5$;$k$?$a$K(B
|
| x / n * n
|
|$B$H$$$&%$%G%#%*%`$r$+$J$j=q$$$F$-$F$k$s$G$9$h$M!#(B

$B$J$k$[$I!#8_49@-LdBj$N2r7h$K$O$J$j$^$;$s$,!“@0?t$r%”%i%$%s$5(B
$B$;$k%a%=%C%I$,M_$7$$$3$H$b$"$k$+$b$7$l$^$;$s$M!#(B

$B$U$J$P$5$s!“$^$D$b$H$5$s!”(B
$B$*JV;v$"$j$,$H$&$4$6$$$^$9!#(B

2011$BG/(B11$B7n(B1$BF|(B22:46 Tadayoshi F. [email protected]:

$BK\5$$GJQ$($kM=Dj$,$“$k$N$J$i!“FCBg$NHs8_49$K$J$j$^$9$N$G!”:#$N$&$A$K(B
$B@Z$j<N$F$?$$>l9g$N?d>)BeBX:v$r7h$a$F(B ( (x/y).round $B$G$9$+$M!)(B) $B!”(B
2.0 $B$+$i7<LX$7$F$*$$$?$[$&$,$$$$$H;W$$$^$9!#(B($B$D$^$j?d>)7A<0$K$J$C$F(B
$B$$$J$$>l9g$K(B warning $B$r=P$9(B)

$B$=$l$O;?@.$G$9!#$3$l$^$G$N;v$r9M$($k$H$“$^$j4|BT$G$-$J$$$G$9$,!#(B
python2 $B$G$d$C$?$h$&$J;v$G$9$,!”(Bruby $B$@$H(B div
$B$r$D$+$($C$F$/$i$$$G$7$g(B
$B$&!#(B

$B$J$k$[$I!#(B
$B!VBe$o$j$K(B Integer#div $B;H$(!W$H$$$&$3$H$J$N$G!“(BInteger#/ $B$,(B
$B8F$P$l$k$?$S!”$b$7$/$O=i$a$F8F$P$l$?;~$@$1$K7Y9p$9$k46$8$G$9$+$M!#(B

$B8D?ME*$K$O!“(BInteger#// $B$H$+JL$N1i;;;R$rF3F~$7$F!”(BInteger#/
$B$OJQ$($J$$(B
$BJ}$,4r$7$$$G$9!#@Z$j<N$F$r4|BT$7$?%3!<%I$r$9$4$/=q$$$F$-$?!#!#!#(B

smalltalk $B$G$O!“(B// $B$,@Z<N$F(B \ $B$,$=$l$NBP$K$J$kM>$j$J$C$F$$$^$9$,!”(B
ruby $B$G$O(B // $B$O@55,I=8=$KHo$k$N$G%@%a$@$H8@$o$l$^$7$?!#$I$C$A$K$7$F$b(B
Integer#/ $B$rJQ$($k;v$K0UL#$,$“$k$N$G!”$=$l$@$C$?$i!“(Bdiv $B$H(B quo
$B$r$D$+$$(B
$B$^$7$g$&$G=*$j$G$9$M!#8e$O$D$+$$$d$9$$$h$&$K(B div $B%a%=%C%I$G$O$J$/!”(Bdiv
$B1i;;;R$rMQ0U$9$k$/$i$$$+!#(B

$B8+$d$9$$CfCV1i;;;R$,$J$$$3$H$,ITK~$J$N$+$J$H;W$C$?$N$G$9$,!"(B
$BJQ$($k$3$H<+BN$,L\E*$J$s$G$9$+$M!#(B

2011$BG/(B11$B7n(B1$BF|(B23:00 Yukihiro M. [email protected]:

$B$^$?!“@0?t(B
$B$,MW5a$5$l$k$H$3$m$G$O$[$H$s$I$N>l9g@Z$j<N$F$,9T$o$l$F$$$k$O(B
$B$:$J$N$G!”<B:]$K$O$"$^$jLdBj$K$J$i$J$$$3$H$,B?$$$+$b$7$l$^$;(B
$B$s!#(B

x $B$r(B n $B$NG?t$K%"%i%$%s$5$;$k$?$a$K(B

x / n * n

$B$H$$$&%$%G%#%*%`$r$+$J$j=q$$$F$-$F$k$s$G$9$h$M!#(B

$B$3$N%$%G%#%%`$,6qBNE$K$I$&$$$&$H$-$KI,MW$+$H$$$&$H!“4JC1$K$O(B
$B@bL@$7$K$/$$$s$G$9$,!”$($($H!“%?%$%k$rBP>NE*$KJB$Y$k$?$a8D?t$r(B
$B6v?t$K8BDj$9$k(B (x / 2 * 2) $B$H$+!”(B10^14 … 10^14 + 1000000 $B$N(B
$BHO0O$NAG?t$rNs5s$9$k(B (2 $BCJ3,%(%i%H%9%F%M%9(B) $B$H$+!#(B
$BL/$JNc$G$9$_$^$;$s!#(B

$B$“$H!“8=>u$N(B quo $B$@$H!”(B4.quo(2) $B$,(B Rational
$B$K$J$k$_$?$$$G$9$,!”(B
$B@0?t$G:Q$`;~$O@0?t$K$J$k$h$&$K$7$^$;$s$+!)(B

$B$?$k$$$G$9!#(B

2011$BG/(B11$B7n(B1$BF|(B22:12 Yusuke E. [email protected]:

$BK\5$$GJQ$($kM=Dj$,$“$k$N$J$i!“FCBg$NHs8_49$K$J$j$^$9$N$G!”:#$N$&$A$K(B
$B@Z$j<N$F$?$$>l9g$N?d>)BeBX:v$r7h$a$F(B ( (x/y).round $B$G$9$+$M!)(B) $B!”(B
2.0 $B$+$i7<LX$7$F$*$$$?$[$&$,$$$$$H;W$$$^$9!#(B($B$D$^$j?d>)7A<0$K$J$C$F(B
$B$$$J$$>l9g$K(B warning $B$r=P$9(B)

$B?d>)BeBX0F$C$F(Bx.div(y)$B$G$9$h$M!)(B

$B8D?ME*$K$O!“(BInteger#// $B$H$+JL$N1i;;;R$rF3F~$7$F!”(BInteger#/
$B$OJQ$($J$$(B
$BJ}$,4r$7$$$G$9!#@Z$j<N$F$r4|BT$7$?%3!<%I$r$9$4$/=q$$$F$-$?!#!#!#(B

$B;d$b(B x / a * b $B$_$?$$$J%3!<%I$O$:$$$V$sBt;3=q$$$F$-$?$N$G!"(B
$BHs8_49$O4r$7$/$J$$$G$9!#(B

$BIaCJ$O1i;;;R$G@0?t$KJD$8$?1i;;$r$7$?$$$N$G$9$,!"(B
Numeric$B$NAm>N@-$N3NJ]$H>e<j$/:.$<$?2r$O$J$$$G$7$g$&$+!)(B

$B$`$i$?$G$9!#(B

(2011.11.01 23:40 ), Yusuke E. wrote:

$B$"$H!“8=>u$N(B quo $B$@$H!”(B4.quo(2) $B$,(B Rational $B$K$J$k$_$?$$$G$9$,!"(B
$B@0?t$G:Q$`;~$O@0?t$K$J$k$h$&$K$7$^$;$s$+!)(B

$B$I$&$;$J$i!"J,Jl$,(B 1 $B$N(B Rational
$B$O$9$Y$F@0?t$K@5=`2=$5$;$k$h$&$K(B
$BJQ99$7$^$;$s$+!)(B

Issue #5512 has been updated by ko1 (Koichi Sasada).

Category set to core
Assignee set to matz (Yukihiro M.)

宙ぶらりんになっているようなので、まつもとさんにアサインしておきます。
ご検討下さい。


Feature #5512: Integer#/ の改訂

Author: tadf (tadayoshi funaba)
Status: Open
Priority: Normal
Assignee: matz (Yukihiro M.)
Category: core
Target version: Next Major

Integer#/ を Integer#quo の別名として定義しなおす事を提案します。

現在の Integer#/ はオペランドが整数である場合値が整数になります。整数を
与えた場合の結果だけを見て、あるいは整数ではない場合の結果だけを見て自
分の望み通りの結果を得たと思い込んでしまうかもしれません。

これついての対処として、Integer#div、または Integer#quo を利用するよう
啓蒙するなどいくつかの提案がありうるでしょうが、本質的な解決法は、やは
り仕様を変更するしかないと思われます。

これはプログラミングにおける総称性の確保の邪魔になり、Numeric#/ を利用
はバグの温床になり得えます。

Issue #5512 has been updated by shugo (Shugo M.).

Status changed from Open to Assigned

ko1 (Koichi Sasada) wrote:

宙ぶらりんになっているようなので、まつもとさんにアサインしておきます。
ご検討下さい。

そういえば、mrubyでは1 / 2が0.5 (Float)になる(ので規格に準拠していない)ようなのですが、
将来CRubyで仕様変更するための布石でしょうか。

後方互換性については、

using OldIntegerDivision

としたらInteger#/が現在の挙動に戻るといった対応は考えられるかなと思いますが、その前に
Refinementsを何とかしないといけないですね…。


Feature #5512: Integer#/ の改訂

Author: tadf (tadayoshi funaba)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro M.)
Category: core
Target version: Next Major

Integer#/ を Integer#quo の別名として定義しなおす事を提案します。

現在の Integer#/ はオペランドが整数である場合値が整数になります。整数を
与えた場合の結果だけを見て、あるいは整数ではない場合の結果だけを見て自
分の望み通りの結果を得たと思い込んでしまうかもしれません。

これついての対処として、Integer#div、または Integer#quo を利用するよう
啓蒙するなどいくつかの提案がありうるでしょうが、本質的な解決法は、やは
り仕様を変更するしかないと思われます。

これはプログラミングにおける総称性の確保の邪魔になり、Numeric#/ を利用
はバグの温床になり得えます。