From 8cfffbeccdab028f780dcaf9f4ffaf97d7393a1e Mon Sep 17 00:00:00 2001 From: Daniel Cerqueira Date: Sun, 16 Aug 2026 12:59:14 +0100 Subject: add diff operator - and remove and diff and differ - and update documentation - and update all lali scripts --- liblali.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'liblali.c') 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) -- cgit