New Lisp functions ASSOC, EFFACE, MAPLIST

This commit is contained in:
Simon Brooke 2023-04-01 17:56:49 +01:00
parent 41cecdc522
commit 5ee9531e6b
10 changed files with 109 additions and 34 deletions

View file

@ -11,6 +11,11 @@
(APPEND LAMBDA
(X Y) (COND ((NULL X) Y) ((QUOTE T) (CONS (CAR X) (APPEND (CDR X) Y)))))
(APPLY)
(ASSOC LAMBDA (X L)
(COND
((NULL L) (QUOTE NIL))
((AND (CONSP (CAR L)) (EQ (CAAR L) X)) (CDAR L))
((QUOTE T) (ASSOC X (CDR L)))))
(ATOM)
(CAR)
(CAAAAR LAMBDA (X) (CAR (CAR (CAR (CAR X)))))
@ -43,6 +48,7 @@
(CDDR LAMBDA (X) (CDR (CDR X)))
(CDR)
(CONS)
(CONSP)
(COPY
LAMBDA
(X)
@ -53,6 +59,11 @@
(DIFFERENCE)
(DIVIDE
LAMBDA (X Y) (CONS (QUOTIENT X Y) (CONS (REMAINDER X Y) (QUOTE NIL))))
(DOC)
(EFFACE
LAMBDA (X L) (COND ((NULL L) (QUOTE NIL))
((EQUAL X (CAR L)) (CDR L))
((QUOTE T) (RPLACD L (EFFACE X (CDR L))))))
(ERROR)
(EQ)
(EQUAL)
@ -78,6 +89,7 @@
((QUOTE T) (INTERSECTION (CDR X) Y))))
(LENGTH LAMBDA (L) (COND ((EQ NIL L) 0) (T (ADD1 (LENGTH (CDR L))))))
(LESSP)
(MAPLIST LAMBDA (L F) (COND ((NULL L) NIL) ((QUOTE T) (CONS (F (CAR L)) (MAPLIST (CDR L) F)))))
(MEMBER
LAMBDA
(A X)

View file

@ -0,0 +1,7 @@
;; Not present in Lisp 1.5(!)
assoc[x; l] = [null[l] -> NIL;
and[consp[car[l]]; eq[caar[l]; x]] -> cdar[l];
T -> assoc[x; cdr[l]]]
;; (ASSOC 'C (PAIR '(A B C D E F) (RANGE 1 6)))

View file

@ -0,0 +1,6 @@
;; page 63. I'm not at all sure why an implementation using RPLACD is preferred
;; over a pure functional implementation here.
efface[x; l] = [null[l] -> NIL;
equal[x; car[l]] -> cdr[l];
T -> rplacd[l; efface[x; cdr[l]]]]

View file

@ -0,0 +1,4 @@
;; page 63
maplist[l; f] = [null[l] -> nil;
T -> cons[f[car[l]]; maplist[cdr[l]; f]]]