diff options
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | lib.c | 28 | ||||
-rw-r--r-- | lib.h | 2 | ||||
-rw-r--r-- | txr.1 | 53 |
4 files changed, 82 insertions, 3 deletions
@@ -5980,6 +5980,8 @@ void eval_init(void) reg_fun(intern(lit("assoc"), user_package), func_n2(assoc)); reg_fun(intern(lit("assql"), user_package), func_n2(assql)); + reg_fun(intern(lit("rassoc"), user_package), func_n2(rassoc)); + reg_fun(intern(lit("rassql"), user_package), func_n2(rassql)); reg_fun(intern(lit("acons"), user_package), func_n3(acons)); reg_fun(intern(lit("acons-new"), user_package), func_n3(acons_new)); reg_fun(intern(lit("aconsql-new"), user_package), func_n3(aconsql_new)); @@ -7277,6 +7277,34 @@ val assql(val key, val list) return nil; } +val rassoc(val key, val list) +{ + list = nullify(list); + + while (list) { + val elem = car(list); + if (equal(cdr(elem), key)) + return elem; + list = cdr(list); + } + + return nil; +} + +val rassql(val key, val list) +{ + list = nullify(list); + + while (list) { + val elem = car(list); + if (eql(cdr(elem), key)) + return elem; + list = cdr(list); + } + + return nil; +} + val acons(val car, val cdr, val list) { return cons(cons(car, cdr), list); @@ -917,6 +917,8 @@ val cptr(mem_t *ptr); mem_t *cptr_get(val cptr); val assoc(val key, val list); val assql(val key, val list); +val rassoc(val key, val list); +val rassql(val key, val list); val acons(val car, val cdr, val list); val acons_new(val key, val value, val list); val acons_new_c(val key, loc new_p, loc list); @@ -18072,10 +18072,13 @@ The function searches an association list .meta alist for a cons cell whose -car field is equivalent to +.code car +field is equivalent to .meta key -(with equality determined by the equal -function). The first such cons is returned. If no such cons is found, +under the +.code equal +function. +The first such cons is returned. If no such cons is found, .code nil is returned. @@ -18094,6 +18097,50 @@ is determined using the function rather than .codn equal . +.coNP Functions @ rassql and @ rassoc +.synb +.mets (rassql < value << alist ) +.mets (rassoc < value << alist ) +.syne +.desc +The +.code rassql +and +.code rassoc +functions are reverse lookup counterparts to +.code assql +and +.codn assoc . +When searching, they examine the +.code cdr +field of the pairs of +.meta alist +rather than the +.code car +field. + +The +.code rassql +function searches association list +.meta alist +for a cons whose +.code cdr +field equivalent to +.meta value +according to the +.code eql +function. If such a cons is found, it is returned. +Otherwise +.code nil +is returned. + +The +.code rassoc +function searches in the same way as +.code rassql +but compares values using +.codn equal . + .coNP Function @ acons .synb .mets (acons < car < cdr << alist ) |