summaryrefslogtreecommitdiff
path: root/liblali.c
diff options
context:
space:
mode:
authorDaniel Cerqueira <dan.git@lispclub.com>2026-08-16 12:59:14 +0100
committerDaniel Cerqueira <dan.git@lispclub.com>2026-08-16 13:37:34 +0100
commit8cfffbeccdab028f780dcaf9f4ffaf97d7393a1e (patch)
tree17c734d83e40be785cbec3ca2df8c069474f5a5e /liblali.c
parent92b27832dbbe786c857e5fb461e218d370c14058 (diff)
add diff operatorv.0.0.0
- and remove and diff and differ - and update documentation - and update all lali scripts
Diffstat (limited to 'liblali.c')
-rw-r--r--liblali.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/liblali.c b/liblali.c
index 38f28b5..cfd4d76 100644
--- a/liblali.c
+++ b/liblali.c
@@ -847,13 +847,22 @@ Object *primitiveAtom(Object **args, GC_PARAM) {
* }
*/
-Object *primitiveDif(Object **args, GC_PARAM) {
+Object *primitiveDiff(Object **args, GC_PARAM) {
Object *first = (*args)->car, *second = (*args)->cdr->car;
if ((first->type == TYPE_NUMBER && second->type == TYPE_NUMBER) ||
(first->type == TYPE_STRING && second->type == TYPE_STRING) ||
(first->type == TYPE_SYMBOL && second->type == TYPE_SYMBOL))
return strcmp(first->string, second->string) ? t : f;
+ else if (first->type == TYPE_CONS && second->type == TYPE_CONS) {
+ for (; (first->cdr != nil || second->cdr != nil);
+ first = first->cdr, second = second->cdr) {
+ if (strcmp(first->string, second->string))
+ return t;
+ }
+ return (strcmp(first->car->string, second->car->string) ||
+ (first->cdr != nil && second->cdr != nil)) ? t : f;
+ }
else
return t;
}
@@ -1282,7 +1291,7 @@ Primitive primitives[] = {
{ "space", 1, 1, primitiveSpace },
{ "atom", 1, 1, primitiveAtom },
/* { "eq", 2, 2, primitiveEq }, */
- { "dif", 2, 2, primitiveDif },
+ { "diff", 2, 2, primitiveDiff },
{ "car", 1, 1, primitiveCar },
{ "cdr", 1, 1, primitiveCdr },
{ "cons", 2, 2, primitiveCons },
@@ -1631,7 +1640,7 @@ static char *stdlib = LISP(
(defmacro defun (name params . body)
(list (quote set) (list quote name) (list (quote lambda) params . body)))
- (defun not (x) (fill ((dif x n) n)
+ (defun not (x) (fill ((diff x n) n)
(x t)
(f f)))
@@ -1639,7 +1648,7 @@ static char *stdlib = LISP(
(defun listp (x) (not (atom x)))
- (defun zerop (x) (not (dif x +0)))
+ (defun zerop (x) (not (diff x +0)))
(defmacro and args
(fill ((algo args) t)
@@ -1664,13 +1673,8 @@ static char *stdlib = LISP(
(defun singul (x) (not (consp x)))
- (defun differ (x y)
- (fill ((and (consp x) (consp y)) (dif x y))
- (f (or (differ (car x) (car y))
- (differ (cdr x) (cdr y))))))
-
(defun nth (num xs)
- (fill ((dif num +0) (car xs))
+ (fill ((diff num +0) (car xs))
(f (nth (- num +1) (cdr xs)))))
(defun append (xs y)