diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-06-06 08:43:00 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-06-06 08:43:00 -0700 |
commit | 6892a6968691e4a5f0965acb83f7e6df202c6007 (patch) | |
tree | 812996797004fbffd570c51df50ef81a6d50ab4c /lib.c | |
parent | 3a725f530cafe0cc95931f67bc40c88001b258a0 (diff) | |
download | txr-6892a6968691e4a5f0965acb83f7e6df202c6007.tar.gz txr-6892a6968691e4a5f0965acb83f7e6df202c6007.tar.bz2 txr-6892a6968691e4a5f0965acb83f7e6df202c6007.zip |
* eval.c (eval_init): Register new search function as intrinsic.
* lib.c (search_list): New static function.
(search): New function.
* lib.h (search): New function declared.
* txr.1: Documented.
* txr.vim: Regenerated.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -5105,6 +5105,72 @@ val update(val seq, val fun) return seq; } +static val search_list(val seq, val key, val testfun, val keyfun) +{ + val iter, siter, kiter; + val pos = zero; + + switch (type(key)) { + case NIL: + return pos; + case CONS: + case LCONS: + case LIT: + case STR: + case LSTR: + case VEC: + /* TODO: optimize me */ + for (iter = seq; iter; iter = cdr(iter)) { + for (siter = iter, kiter = key; + siter && kiter; + siter = cdr(siter), kiter = cdr(kiter)) + { + if (!funcall2(testfun, + funcall1(keyfun, car(siter)), + funcall1(keyfun, car(kiter)))) + { + pos = plus(pos, one); + break; + } + } + + if (!kiter) + return pos; + + if (!siter) + break; + } + break; + default: + type_mismatch(lit("search: ~s is not a sequence"), cons, nao); + } + + return nil; +} + +val search(val seq, val key, val testfun, val keyfun) +{ + testfun = default_arg(testfun, equal_f); + keyfun = default_arg(keyfun, identity_f); + + switch (type(seq)) { + case NIL: + return if3(length(key) == zero, zero, nil); + case CONS: + case LCONS: + case LIT: + case STR: + case LSTR: + case VEC: + /* TODO: optimize me */ + return search_list(seq, key, testfun, keyfun); + default: + type_mismatch(lit("search: ~s is not a sequence"), cons, nao); + } + + return seq; +} + val env(void) { if (env_list) { |