implement some Numeric methods in Ruby

parent 3ae06167
##
# Numeric
#
# ISO 15.2.7
class Numeric
##
# Returns the receiver simply.
#
# ISO 15.2.7.4.1
def +@
self
end
##
# Returns the receiver's value, negated.
#
# ISO 15.2.7.4.2
def -@
0 - self
end
##
# Returns the absolute value of the receiver.
#
# ISO 15.2.7.4.3
def abs
if self < 0
-self
else
self
end
end
end
##
# Integer
#
......
......@@ -41,38 +41,6 @@ mrb_to_flo(mrb_state *mrb, mrb_value val)
return mrb_float(val);
}
/*
* call-seq:
* +num -> num
*
* Unary Plus---Returns the receiver's value.
*/
static mrb_value
num_uplus(mrb_state *mrb, mrb_value num)
{
return num;
}
/*
* call-seq:
* -num -> numeric
*
* Unary Minus---Returns the receiver's value, negated.
*/
static mrb_value
num_uminus(mrb_state *mrb, mrb_value num)
{
return mrb_float_value(mrb, (mrb_float)0 - mrb_to_flo(mrb, num));
}
static mrb_value
fix_uminus(mrb_state *mrb, mrb_value num)
{
return mrb_fixnum_value(0 - mrb_fixnum(num));
}
/*
* call-seq:
*
......@@ -131,27 +99,6 @@ num_div(mrb_state *mrb, mrb_value x)
return mrb_float_value(mrb, mrb_to_flo(mrb, x) / y);
}
/*
* call-seq:
* num.abs -> numeric
* num.magnitude -> numeric
*
* Returns the absolute value of <i>num</i>.
*
* 12.abs #=> 12
* (-34.56).abs #=> 34.56
* -34.56.abs #=> 34.56
*/
static mrb_value
num_abs(mrb_state *mrb, mrb_value num)
{
if (mrb_to_flo(mrb, num) < 0) {
return num_uminus(mrb, num);
}
return num;
}
/********************************************************************
*
* Document-class: Float
......@@ -1325,12 +1272,9 @@ mrb_init_numeric(mrb_state *mrb)
numeric = mrb_define_class(mrb, "Numeric", mrb->object_class);
mrb_include_module(mrb, numeric, mrb_class_get(mrb, "Comparable"));
mrb_define_method(mrb, numeric, "+@", num_uplus, MRB_ARGS_REQ(1)); /* 15.2.7.4.1 */
mrb_define_method(mrb, numeric, "-@", num_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.2 */
mrb_define_method(mrb, numeric, "**", num_pow, MRB_ARGS_REQ(1));
mrb_define_method(mrb, numeric, "/", num_div, MRB_ARGS_REQ(1)); /* 15.2.8.3.4 */
mrb_define_method(mrb, numeric, "quo", num_div, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
mrb_define_method(mrb, numeric, "abs", num_abs, MRB_ARGS_NONE()); /* 15.2.7.4.3 */
mrb_define_method(mrb, numeric, "<=>", num_cmp, MRB_ARGS_REQ(1)); /* 15.2.9.3.6 */
/* Integer Class */
......@@ -1338,11 +1282,10 @@ mrb_init_numeric(mrb_state *mrb)
mrb_undef_class_method(mrb, integer, "new");
mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */
mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE());
fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer);
fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer);
mrb_define_method(mrb, fixnum, "+", fix_plus, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */
mrb_define_method(mrb, fixnum, "-", fix_minus, MRB_ARGS_REQ(1)); /* 15.2.8.3.2 */
mrb_define_method(mrb, fixnum, "-@", fix_uminus, MRB_ARGS_REQ(1)); /* 15.2.7.4.2 */
mrb_define_method(mrb, fixnum, "*", fix_mul, MRB_ARGS_REQ(1)); /* 15.2.8.3.3 */
mrb_define_method(mrb, fixnum, "%", fix_mod, MRB_ARGS_REQ(1)); /* 15.2.8.3.5 */
mrb_define_method(mrb, fixnum, "==", fix_equal, MRB_ARGS_REQ(1)); /* 15.2.8.3.7 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment