summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-03-26 16:55:04 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-03-26 16:55:04 -0700
commitc2881f8bf8222ed8edb940a112b352ed93ce9d47 (patch)
tree9085b982fce8e9a307e60a8c8f2bd1b47190b50a
parentab59762e97c7f68f271fde7401d93c26bbbe7d6d (diff)
downloadtxr-c2881f8bf8222ed8edb940a112b352ed93ce9d47.tar.gz
txr-c2881f8bf8222ed8edb940a112b352ed93ce9d47.tar.bz2
txr-c2881f8bf8222ed8edb940a112b352ed93ce9d47.zip
range, range*: use arithp.
* eval.c (range, range_star); Instead of type switch use arith. This includes user-defined arithmetic objects. For that reason, in range_star, use equal instead of eql.
-rw-r--r--eval.c108
1 files changed, 45 insertions, 63 deletions
diff --git a/eval.c b/eval.c
index abfa61dc..68ea1865 100644
--- a/eval.c
+++ b/eval.c
@@ -5991,38 +5991,29 @@ static val range(val from_in, val to_in, val step_in)
val from = default_arg(from_in, zero);
val to = default_null_arg(to_in);
- switch (type(from)) {
- case NUM:
- case BGNUM:
- case FLNUM:
- case CHR:
- case RNG:
- {
- val step = default_arg(step_in, if3(to && gt(from, to), negone, one));
- val env = cons(from, cons(to, step));
- return make_lazy_cons(func_f1(env, range_func));
- }
- default:
- {
- val step = default_arg(step_in, one);
+ if (arithp(from)) {
+ val step = default_arg(step_in, if3(to && gt(from, to), negone, one));
+ val env = cons(from, cons(to, step));
+ return make_lazy_cons(func_f1(env, range_func));
+ } else {
+ val step = default_arg(step_in, one);
- if (functionp(step)){
- if (missingp(to_in)) {
- val env = cons(from, step);
- return make_lazy_cons(func_f1(env, range_func_fstep_inf));
- } else {
- val env = cons(from, cons(to, step));
- return make_lazy_cons(func_f1(env, range_func_fstep));
- }
- } else if (integerp(step) && plusp(step)) {
- val iter = iter_begin(rcons(from, to));
- val env = cons(iter, step);
- return if2(iter_more(iter),
- make_lazy_cons(func_f1(env, range_func_iter)));
+ if (functionp(step)){
+ if (missingp(to_in)) {
+ val env = cons(from, step);
+ return make_lazy_cons(func_f1(env, range_func_fstep_inf));
} else {
- uw_throwf(error_s, lit("~s: step must be positive integer, not ~s"),
- self, step, nao);
+ val env = cons(from, cons(to, step));
+ return make_lazy_cons(func_f1(env, range_func_fstep));
}
+ } else if (integerp(step) && plusp(step)) {
+ val iter = iter_begin(rcons(from, to));
+ val env = cons(iter, step);
+ return if2(iter_more(iter),
+ make_lazy_cons(func_f1(env, range_func_iter)));
+ } else {
+ uw_throwf(error_s, lit("~s: step must be positive integer, not ~s"),
+ self, step, nao);
}
}
}
@@ -6100,44 +6091,35 @@ static val range_star(val from_in, val to_in, val step_in)
val from = default_arg(from_in, zero);
val to = default_null_arg(to_in);
- if (eql(from, to)) {
+ if (equal(from, to)) {
return nil;
- } else switch (type(from)) {
- case NUM:
- case BGNUM:
- case FLNUM:
- case CHR:
- case RNG:
- {
- val step = default_arg(step_in, if3(to && gt(from, to), negone, one));
- val env = cons(from, cons(to, step));
- return make_lazy_cons(func_f1(env, range_star_func));
- }
- default:
- {
- val step = default_arg(step_in, one);
+ } else if (arithp(from)) {
+ val step = default_arg(step_in, if3(to && gt(from, to), negone, one));
+ val env = cons(from, cons(to, step));
+ return make_lazy_cons(func_f1(env, range_star_func));
+ } else {
+ val step = default_arg(step_in, one);
- if (functionp(step)){
- if (missingp(to_in)) {
- val env = cons(from, step);
- return make_lazy_cons(func_f1(env, range_func_fstep_inf));
- } else {
- val env = cons(from, cons(to, step));
- return make_lazy_cons(func_f1(env, range_star_func_fstep));
- }
- } else if (integerp(step) && plusp(step)) {
- val iter = iter_begin(rcons(from, to));
- if (iter_more(iter)) {
- val next = iter_item(iter);
- val nxiter = iter_step(iter);
- val env = cons(nxiter, cons(next, step));
- return make_lazy_cons(func_f1(env, range_star_func_iter));
- }
- return nil;
+ if (functionp(step)){
+ if (missingp(to_in)) {
+ val env = cons(from, step);
+ return make_lazy_cons(func_f1(env, range_func_fstep_inf));
} else {
- uw_throwf(error_s, lit("~s: step must be positive integer, not ~s"),
- self, step, nao);
+ val env = cons(from, cons(to, step));
+ return make_lazy_cons(func_f1(env, range_star_func_fstep));
+ }
+ } else if (integerp(step) && plusp(step)) {
+ val iter = iter_begin(rcons(from, to));
+ if (iter_more(iter)) {
+ val next = iter_item(iter);
+ val nxiter = iter_step(iter);
+ val env = cons(nxiter, cons(next, step));
+ return make_lazy_cons(func_f1(env, range_star_func_iter));
}
+ return nil;
+ } else {
+ uw_throwf(error_s, lit("~s: step must be positive integer, not ~s"),
+ self, step, nao);
}
}
}