斎藤です。

----- Original Message ----- 
From: "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp>
Sent: Tuesday, July 08, 2003 2:28 PM
Subject: [ruby-dev:20544] Re: [BigDecimal] changing rule of coerce

> > |(新規にf_BigDecimal()関数を作ろうかとも思ったのですが、
> こちらを採用したいです(時間がとれれば自分でやりますけど...)。

了解しました。[ruby-dev:20565]でのまつもとさんの解説のおかげで
問題が分かりました。ありがとうございます。

以下、グローバル関数 BigDecimal()を追加したdiffです。
ドキュメントの方も少し付け足してみました。

% ruby -rbigdecimal -e 'd=BigDecimal("1.2345"); puts d'
0.12345E1
% ruby -rbigdecimal -e 'class D<BigDecimal; end; d=D.new("1.23"); p d.class'
D

となるので、今度こそ合っていると思うのですが…。


Index: bigdecimal.c
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal.c,v
retrieving revision 1.9
diff -u -r1.9 bigdecimal.c
--- bigdecimal.c        1 Jul 2003 14:14:18 -0000       1.9
+++ bigdecimal.c        9 Jul 2003 16:15:07 -0000
@@ -1170,6 +1170,25 @@
 }

 static VALUE
+f_BigDecimal(int argc, VALUE *argv, VALUE self)
+{
+    ENTER(5);
+    Real *pv;
+    S_LONG mf;
+    VALUE  nFig;
+    VALUE  iniValue;
+
+    if(rb_scan_args(argc,argv,"11",&iniValue,&nFig)==1) {
+        mf = 0;
+    } else {
+        mf = GetPositiveInt(nFig);
+    }
+    SafeStringValue(iniValue);
+    GUARD_OBJ(pv,VpCreateRbObject(mf, RSTRING(iniValue)->ptr));
+    return ToValue(pv);
+}
+
+static VALUE
 BigDecimal_limit(int argc, VALUE *argv, VALUE self)
 {
     VALUE  nFig;
@@ -1358,6 +1377,9 @@
     coerce = rb_intern("coerce");
     /* Class and method registration */
     rb_cBigDecimal = rb_define_class("BigDecimal",rb_cNumeric);
+
+    /* Global function */
+    rb_define_global_function("BigDecimal", f_BigDecimal, -1);

     /* Class methods */
     rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, 2);
Index: bigdecimal_en.html
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal_en.html,v
retrieving revision 1.4
diff -u -r1.4 bigdecimal_en.html
--- bigdecimal_en.html  27 Jun 2003 04:38:57 -0000      1.4
+++ bigdecimal_en.html  9 Jul 2003 16:15:07 -0000
@@ -99,7 +99,8 @@
 where:<BR>
 s: Initial value string.<BR>
 n: Maximum number of significant digits of a. n must be a Fixnum object.
-If n is omitted or is equal to 0,then the maximum number of significant
digits of a is determined from the length of s.
+If n is omitted or is equal to 0,then the maximum number of significant
digits of a is determined from the length of s.<BR>
+In addition, global function BigDecimal(s[,n]) is also defined as an
another
name.
 </BLOCKQUOTE>

 <LI><B>mode</B></LI><BLOCKQUOTE>
Index: bigdecimal_ja.html
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal_ja.html,v
retrieving revision 1.4
diff -u -r1.4 bigdecimal_ja.html
--- bigdecimal_ja.html  27 Jun 2003 04:38:57 -0000      1.4
+++ bigdecimal_ja.html  9 Jul 2003 16:15:08 -0000
@@ -108,7 +108,8 @@
 n は必要な有効桁数(a の最大有効桁数)を整数で指定します。
 n が 0 または省略されたときは、n の値は s の有効桁数とみなされます。
 s の有効桁数より n が小さいときも n=0 のときと同じです。
-a の最大有効桁数は n より若干大い値が採用されます。
+a の最大有効桁数は n より若干大い値が採用されます。<BR>
+また同じ意味を持つグローバル関数として、BigDecimal(s[,n])が定義されていま
す。
 </BLOCKQUOTE>

 <LI><B>mode</B></LI><BLOCKQUOTE>


---
斎藤ただし