summaryrefslogtreecommitdiffstats
path: root/arith.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-08-07 06:25:56 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-08-07 06:25:56 -0700
commit10eda95d8ed320f2dc10edd23bd7bdd238f13ace (patch)
tree5bd474b6a3a74dac950bc3d29fa612850e3bba2b /arith.c
parent9fb46f29b241253a31158012de3689bb654802e5 (diff)
downloadtxr-10eda95d8ed320f2dc10edd23bd7bdd238f13ace.tar.gz
txr-10eda95d8ed320f2dc10edd23bd7bdd238f13ace.tar.bz2
txr-10eda95d8ed320f2dc10edd23bd7bdd238f13ace.zip
New function: signum.
arith.c (signum): New function. (arith_init): signum intrinsic registered. * txr.1: Documented.
Diffstat (limited to 'arith.c')
-rw-r--r--arith.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/arith.c b/arith.c
index 7b02863a..493492a3 100644
--- a/arith.c
+++ b/arith.c
@@ -748,6 +748,26 @@ val abso(val anum)
}
}
+static val signum(val anum)
+{
+ switch (type(anum)) {
+ case BGNUM:
+ return if3(ISNEG(mp(anum)), negone, one);
+ case FLNUM:
+ {
+ double a = anum->fl.n;
+ return flo(if3(a > 0, 1.0, if3(a < 0, -1.0, 0.0)));
+ }
+ case NUM:
+ {
+ cnum a = c_num(anum);
+ return if3(a > 0, one, if3(a < 0, negone, zero));
+ }
+ default:
+ uw_throwf(error_s, lit("signum: ~s is not a number"), anum, nao);
+ }
+}
+
val mul(val anum, val bnum)
{
val self = lit("*");
@@ -3176,6 +3196,8 @@ void arith_init(void)
reg_varl(intern(lit("*e*"), user_package), flo(M_E));
reg_varl(intern(lit("%e%"), user_package), flo(M_E));
+ reg_fun(intern(lit("signum"), user_package), func_n1(signum));
+
reg_fun(intern(lit("bignum-len"), user_package), func_n1(bignum_len));
reg_fun(intern(lit("divides"), user_package), func_n2(divides));
reg_fun(intern(lit("bits"), system_package), func_n1(bits));