diff options
-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 <= |