From 0e3c047c3fa3ef7d3e7168314bf6fdb0ba15443d Mon Sep 17 00:00:00 2001
From: Kaz Kyheku <kaz@kylheku.com>
Date: Mon, 24 Feb 2020 23:03:08 -0800
Subject: New function: assq and rassq.

TXR Lisp is henceforth a dialect in which

  (cdr (assq key a-list))

works exactly as shown, without substitution of
assql or assoc.

* eval.c (eval_init): Register assq and rassq intrinsics.

* lib.c (assq, rassq): New functions.

* lib.h (assq, rassq): Declared.

* txr.1: Documented.

* tests/012/ashwin.tl: New file.

* tests/012/ashwin.expected: New file.
---
 lib.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

(limited to 'lib.c')

diff --git a/lib.c b/lib.c
index 011da356..dc9f28d3 100644
--- a/lib.c
+++ b/lib.c
@@ -8178,6 +8178,20 @@ val assql(val key, val list)
   return nil;
 }
 
+val assq(val key, val list)
+{
+  list = nullify(list);
+
+  while (list) {
+    val elem = car(list);
+    if (eq(car(elem), key))
+      return elem;
+    list = cdr(list);
+  }
+
+  return nil;
+}
+
 val rassoc(val key, val list)
 {
   list = nullify(list);
@@ -8206,6 +8220,20 @@ val rassql(val key, val list)
   return nil;
 }
 
+val rassq(val key, val list)
+{
+  list = nullify(list);
+
+  while (list) {
+    val elem = car(list);
+    if (eq(cdr(elem), key))
+      return elem;
+    list = cdr(list);
+  }
+
+  return nil;
+}
+
 val acons(val car, val cdr, val list)
 {
   return cons(cons(car, cdr), list);
-- 
cgit v1.2.3