diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-07-11 20:48:34 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-07-11 20:48:34 -0700 |
commit | b2bb2af765a550efd92adb25687cb76f955574e3 (patch) | |
tree | f1eaa8bf8750b3cba95a5d40f95e808d94fb60ca /lib.c | |
parent | d9d8beefbf45eaea89d4174e55df37ed89690ec9 (diff) | |
download | txr-b2bb2af765a550efd92adb25687cb76f955574e3.tar.gz txr-b2bb2af765a550efd92adb25687cb76f955574e3.tar.bz2 txr-b2bb2af765a550efd92adb25687cb76f955574e3.zip |
New funtion related to where function.
* eval.c (eval_init): register intrinsics wheref, whereq,
whereql and wherequal.
* lib.c (wheref_fun): New static function.
(wheref, whereq, whereql, wherequal): New functions.
* lib.h (wheref, whereq, whereql, wherequal): Declared.
* tests/012/seq.tl: New tests.
* txr.1: Documented.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -14053,6 +14053,46 @@ val where(val func, val seq) } } +static val wheref_fun(val func, val seq) +{ + val iter = iter_begin(seq); + val index = zero; + + for (;;) { + if (!iter_more(iter)) + return nil; + if (funcall1(func, iter_item(iter))) + break; + iter = iter_step(iter); + index = succ(index); + } + + iter = iter_step(iter); + return make_lazy_cons_car_cdr(func_f1(iter, lazy_where_func), + index, func); +} + +val wheref(val func) +{ + return func_f1(func, wheref_fun); +} + + +val whereq(val obj) +{ + return func_f1(pa_12_1(eq_f, obj), wheref_fun); +} + +val whereql(val obj) +{ + return func_f1(pa_12_1(eql_f, obj), wheref_fun); +} + +val wherequal(val obj) +{ + return func_f1(pa_12_1(equal_f, obj), wheref_fun); +} + val sel(val seq, val where_in) { val self = lit("select"); |