diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-12-13 19:37:19 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-12-13 19:37:19 -0800 |
commit | 64b06932ed7d8dd8c904e66a70a53ae4c8ec4448 (patch) | |
tree | 643059d8904fda99b240ae6756100943a7a1c3e5 | |
parent | ef47dfe4fcb7c1be369ae83221386b9da6474a1e (diff) | |
download | txr-64b06932ed7d8dd8c904e66a70a53ae4c8ec4448.tar.gz txr-64b06932ed7d8dd8c904e66a70a53ae4c8ec4448.tar.bz2 txr-64b06932ed7d8dd8c904e66a70a53ae4c8ec4448.zip |
* arith.c (evenp, oddp): New functions.
* eval.c (eval_init): New functions registered as intrinsics.
* lib.h (evenp, oddp): Declared.
* txr.1: Documentation stub updated.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | arith.c | 30 | ||||
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | lib.h | 2 | ||||
-rw-r--r-- | txr.1 | 2 |
5 files changed, 45 insertions, 1 deletions
@@ -1,5 +1,15 @@ 2011-12-13 Kaz Kylheku <kaz@kylheku.com> + * arith.c (evenp, oddp): New functions. + + * eval.c (eval_init): New functions registered as intrinsics. + + * lib.h (evenp, oddp): Declared. + + * txr.1: Documentation stub updated. + +2011-12-13 Kaz Kylheku <kaz@kylheku.com> + * arith.c (highest_bit): Linkage changed to static. (abso, isqrt): New functions. (isqrt_fixnum): New static function. @@ -711,6 +711,36 @@ val zerop(val num) return nil; } +val evenp(val num) +{ + switch (tag(num)) { + case TAG_NUM: + return (c_num(num) % 2 == 0) ? t : nil; + case TAG_PTR: + if (num->t.type == BGNUM) + return mp_iseven(mp(num)) ? t : nil; + /* fallthrough */ + default: + uw_throwf(error_s, lit("evenp: ~s is not a number"), num, nao); + return nil; + } +} + +val oddp(val num) +{ + switch (tag(num)) { + case TAG_NUM: + return (c_num(num) % 2 != 0) ? t : nil; + case TAG_PTR: + if (num->t.type == BGNUM) + return mp_isodd(mp(num)) ? t : nil; + /* fallthrough */ + default: + uw_throwf(error_s, lit("oddp: ~s is not a number"), num, nao); + return nil; + } +} + val gt(val anum, val bnum) { int tag_a = tag(anum); @@ -1166,6 +1166,8 @@ void eval_init(void) reg_fun(intern(lit("numberp"), user_package), func_n1(numberp)); reg_fun(intern(lit("zerop"), user_package), func_n1(zerop)); + reg_fun(intern(lit("evenp"), user_package), func_n1(evenp)); + reg_fun(intern(lit("oddp"), user_package), func_n1(oddp)); reg_fun(intern(lit(">"), user_package), func_n1v(gtv)); reg_fun(intern(lit("<"), user_package), func_n1v(ltv)); reg_fun(intern(lit(">="), user_package), func_n1v(gev)); @@ -375,6 +375,8 @@ val mulv(val nlist); val trunc(val anum, val bnum); val mod(val anum, val bnum); val zerop(val num); +val evenp(val num); +val oddp(val num); val gt(val anum, val bnum); val lt(val anum, val bnum); val ge(val anum, val bnum); @@ -4815,7 +4815,7 @@ The following are Lisp functions and variables built-in to TXR. .SS Functions fixnump, bignump, numberp -.SS Function zerop +.SS Functions zerop, evenp, oddp .SS Relational functions >, <, >= and <= |