diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-12-03 21:28:47 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-12-03 21:28:47 -0800 |
commit | 336071aa972798af0252345d90e0a8d4acdc1e00 (patch) | |
tree | cf57a1f13fc6cc263717f9645a1c06d30d1a88a2 /lib.c | |
parent | 252111c171f300a7990bdc79f45dbe55aba0f36b (diff) | |
download | txr-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.c | 55 |
1 files changed, 43 insertions, 12 deletions
@@ -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) |