mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
implement some Numeric methods in Ruby
This commit is contained in:
@@ -1,3 +1,37 @@
|
||||
##
|
||||
# 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
|
||||
#
|
||||
|
||||
+1
-58
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user