diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-03-26 16:55:04 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-03-26 16:55:04 -0700 |
commit | c2881f8bf8222ed8edb940a112b352ed93ce9d47 (patch) | |
tree | 9085b982fce8e9a307e60a8c8f2bd1b47190b50a | |
parent | ab59762e97c7f68f271fde7401d93c26bbbe7d6d (diff) | |
download | txr-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.c | 108 |
1 files changed, 45 insertions, 63 deletions
@@ -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); } } } |