summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-12-03 21:28:47 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-12-03 21:28:47 -0800
commit336071aa972798af0252345d90e0a8d4acdc1e00 (patch)
treecf57a1f13fc6cc263717f9645a1c06d30d1a88a2 /lib.c
parent252111c171f300a7990bdc79f45dbe55aba0f36b (diff)
downloadtxr-336071aa972798af0252345d90e0a8d4acdc1e00.tar.gz
txr-336071aa972798af0252345d90e0a8d4acdc1e00.tar.bz2
txr-336071aa972798af0252345d90e0a8d4acdc1e00.zip
Expose lazy lists in TXR Lisp.
* eval.c (eval_init): New intrinsic functions. * lib.c (rplaca, rplacd, lcons_fun): New functions. (make_lazycons): Renamed to make_lazy_cons, relocated and turned into external function. (lazy_stream_func, lazy_stream_cons): Follow rename of make_lazycons. * lib.h (rplaca, rplacd, make_lazy_cons, lcons_fun): Declared. * txr.1: Stub sections created.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c55
1 files changed, 43 insertions, 12 deletions
diff --git a/lib.c b/lib.c
index 18b858dc..d20d7b20 100644
--- a/lib.c
+++ b/lib.c
@@ -209,6 +209,31 @@ val cdr(val cons)
}
}
+val rplaca(val cons, val new_car)
+{
+ switch (type(cons)) {
+ case CONS:
+ return cons->c.car = new_car;
+ case LCONS:
+ return cons->lc.car = new_car;
+ default:
+ type_mismatch(lit("~s is not a cons"), cons, nao);
+ }
+}
+
+
+val rplacd(val cons, val new_car)
+{
+ switch (type(cons)) {
+ case CONS:
+ return cons->c.cdr = new_car;
+ case LCONS:
+ return cons->lc.cdr = new_car;
+ default:
+ type_mismatch(lit("~s is not a cons"), cons, nao);
+ }
+}
+
val *car_l(val cons)
{
switch (type(cons)) {
@@ -619,6 +644,21 @@ val cons(val car, val cdr)
return obj;
}
+val make_lazy_cons(val func)
+{
+ val obj = make_obj();
+ obj->lc.type = LCONS;
+ obj->lc.car = obj->lc.cdr = nil;
+ obj->lc.func = func;
+ return obj;
+}
+
+val lcons_fun(val lcons)
+{
+ type_check(lcons, LCONS);
+ return lcons->lc.func;
+}
+
val list(val first, ...)
{
va_list vl;
@@ -2270,15 +2310,6 @@ val vec_push(val vec, val item)
return fill;
}
-static val make_lazycons(val func)
-{
- val obj = make_obj();
- obj->lc.type = LCONS;
- obj->lc.car = obj->lc.cdr = nil;
- obj->lc.func = func;
- return obj;
-}
-
static val lazy_stream_func(val env, val lcons)
{
val stream = car(env);
@@ -2286,7 +2317,7 @@ static val lazy_stream_func(val env, val lcons)
val ahead = get_line(stream);
lcons->lc.car = next;
- lcons->lc.cdr = if2(ahead, make_lazycons(lcons->lc.func));
+ lcons->lc.cdr = if2(ahead, make_lazy_cons(lcons->lc.func));
lcons->lc.func = nil;
if (!next || !ahead)
@@ -2307,8 +2338,8 @@ val lazy_stream_cons(val stream)
return nil;
}
- return make_lazycons(func_f1(cons(stream, cons(first, nil)),
- lazy_stream_func));
+ return make_lazy_cons(func_f1(cons(stream, cons(first, nil)),
+ lazy_stream_func));
}
val lazy_str(val lst, val term, val limit)