summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-12-18 06:45:28 -0800
committerKaz Kylheku <kaz@kylheku.com>2017-12-18 06:45:28 -0800
commited96dfc8f4bee9d15bbe62dd5f97891727835db6 (patch)
treebcdc2b5f8fb5f8c585cdcbe8e98f1993e488cc7b /eval.c
parent9107ce48a93c737a9bbe645e37e8cc3b01a0903d (diff)
downloadtxr-ed96dfc8f4bee9d15bbe62dd5f97891727835db6.tar.gz
txr-ed96dfc8f4bee9d15bbe62dd5f97891727835db6.tar.bz2
txr-ed96dfc8f4bee9d15bbe62dd5f97891727835db6.zip
New functions: rlist and rlist*.
These easily express discontinuous ranges. * eval.c (rlist_fun, rlist_star_fun, rlist, rlist_star): New static functions. (eval_init): Register rlist and rlist* intrinsics. * txr.1: Documented.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index b321d692..a3c79574 100644
--- a/eval.c
+++ b/eval.c
@@ -5025,6 +5025,44 @@ static val range_star(val from_in, val to_in, val step_in)
}
}
+static val rlist_fun(val item)
+{
+ if (rangep(item)) {
+ val rto = to(item);
+ return if3(rangep(rto),
+ range(from(item), from(rto), to(rto)),
+ range(from(item), rto, nil));
+ }
+
+ return cons(item, nil);
+}
+
+static val rlist_star_fun(val item)
+{
+ if (rangep(item)) {
+ val rto = to(item);
+ return if3(rangep(rto),
+ range_star(from(item), from(rto), to(rto)),
+ range_star(from(item), rto, nil));
+ }
+
+ return cons(item, nil);
+}
+
+static val rlist(struct args *items)
+{
+ args_decl_list(lists, ARGS_MIN,
+ lazy_mapcar(func_n1(rlist_fun), args_get_list(items)));
+ return lazy_appendv(lists);
+}
+
+static val rlist_star(struct args *items)
+{
+ args_decl_list(lists, ARGS_MIN,
+ lazy_mapcar(func_n1(rlist_star_fun), args_get_list(items)));
+ return lazy_appendv(lists);
+}
+
static val generate_func(val env, val lcons)
{
cons_bind (while_pred, gen_fun, env);
@@ -6340,6 +6378,8 @@ void eval_init(void)
reg_fun(intern(lit("range"), user_package), func_n3o(range, 0));
reg_fun(intern(lit("range*"), user_package), func_n3o(range_star, 0));
+ reg_fun(intern(lit("rlist"), user_package), func_n0v(rlist));
+ reg_fun(intern(lit("rlist*"), user_package), func_n0v(rlist_star));
reg_fun(generate_s, func_n2(generate));
reg_fun(intern(lit("giterate"), user_package), func_n3o(giterate, 2));
reg_fun(intern(lit("ginterate"), user_package), func_n3o(ginterate, 2));