aboutsummaryrefslogtreecommitdiff
path: root/src/boot/strap/utility.clisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot/strap/utility.clisp')
-rw-r--r--src/boot/strap/utility.clisp58
1 files changed, 54 insertions, 4 deletions
diff --git a/src/boot/strap/utility.clisp b/src/boot/strap/utility.clisp
index 1a288c10..784ec366 100644
--- a/src/boot/strap/utility.clisp
+++ b/src/boot/strap/utility.clisp
@@ -18,7 +18,8 @@
'(|objectMember?| |symbolMember?| |stringMember?| |charMember?|
|scalarMember?| |listMember?| |reverse| |reverse!|
|lastNode| |append| |append!| |copyList| |substitute|
- |substitute!| |setDifference| |setUnion| |setIntersection|
+ |substitute!| |listMap| |listMap!| |butLast| |butLast!|
+ |lastItem| |setDifference| |setUnion| |setIntersection|
|symbolAssoc| |applySubst| |applySubst!| |applySubstNQ|
|objectAssoc| |invertSubst| |substTarget| |substSource|
|remove| |removeSymbol| |atomic?| |every?| |any?| |take|
@@ -43,6 +44,12 @@
(FTYPE (FUNCTION ((|%List| |%Thing|)) (|%Maybe| (|%Node| |%Thing|)))
|lastNode|))
+(DECLAIM (FTYPE (FUNCTION ((|%List| |%Thing|)) |%Thing|) |lastItem|))
+
+(DECLAIM (FTYPE (FUNCTION ((|%List| |%Thing|)) (|%List| |%Thing|)) |butLast|))
+
+(DECLAIM (FTYPE (FUNCTION ((|%List| |%Thing|)) (|%List| |%Thing|)) |butLast!|))
+
(DECLAIM
(FTYPE (FUNCTION ((|%List| |%Thing|) |%Symbol|) (|%List| |%Thing|))
|removeSymbol|))
@@ -120,7 +127,7 @@
(COND
((OR (NOT (CONSP |bfVar#1|)) (PROGN (SETQ |x| (CAR |bfVar#1|)) NIL))
(RETURN |bfVar#2|))
- (T (SETQ |bfVar#2| (APPLY |f| |x| NIL))
+ (T (SETQ |bfVar#2| (FUNCALL |f| |x|))
(COND ((NOT |bfVar#2|) (RETURN NIL)))))
(SETQ |bfVar#1| (CDR |bfVar#1|)))))
@@ -130,7 +137,7 @@
(COND
((OR (NOT (CONSP |bfVar#1|)) (PROGN (SETQ |x| (CAR |bfVar#1|)) NIL))
(RETURN |bfVar#2|))
- (T (SETQ |bfVar#2| (APPLY |f| |x| NIL))
+ (T (SETQ |bfVar#2| (FUNCALL |f| |x|))
(COND (|bfVar#2| (RETURN |bfVar#2|)))))
(SETQ |bfVar#1| (CDR |bfVar#1|)))))
@@ -159,7 +166,7 @@
(LOOP
(COND
((OR (NOT (CONSP |bfVar#1|)) (PROGN (SETQ |x| (CAR |bfVar#1|)) NIL)
- (NOT (APPLY |f| |x| NIL)))
+ (NOT (FUNCALL |f| |x|)))
(RETURN |bfVar#2|))
((NULL |bfVar#2|) (SETQ |bfVar#2| #1=(CONS |x| NIL))
(SETQ |bfVar#3| |bfVar#2|))
@@ -254,6 +261,29 @@
(T (SETQ |l| |l'|))))
|l|)))
+(DEFUN |lastItem| (|l|) (CAR (|lastNode| |l|)))
+
+(DEFUN |butLast| (|l|)
+ (LET* (|xs| |LETTMP#1|)
+ (COND ((NOT (CONSP |l|)) NIL)
+ (T (SETQ |LETTMP#1| (|reverse| |l|))
+ (SETQ |xs| (|reverse!| (CDR |LETTMP#1|))) |xs|))))
+
+(DEFUN |butLast!| (|l|)
+ (LET* (|ISTMP#1|)
+ (COND ((OR (NOT (CONSP |l|)) (NULL (CDR |l|))) NIL)
+ (T
+ (LET ((|xs| |l|))
+ (LOOP
+ (COND ((NOT (CONSP |xs|)) (RETURN NIL))
+ ((AND (CONSP |xs|)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |xs|))
+ (AND (CONSP |ISTMP#1|) (NULL (CDR |ISTMP#1|)))))
+ (IDENTITY (RETURN (RPLACD |xs| NIL)))))
+ (SETQ |xs| (CDR |xs|))))
+ |l|))))
+
(DEFUN |copyList| (|l|)
(LET* (|l'| |t|)
(COND ((NOT (CONSP |l|)) |l|)
@@ -271,6 +301,26 @@
(DEFUN |append| (|x| |y|) (|append!| (|copyList| |x|) |y|))
+(DEFUN |listMap| (|l| |fun|)
+ (LET ((|bfVar#2| NIL) (|bfVar#3| NIL) (|bfVar#1| |l|) (|x| NIL))
+ (LOOP
+ (COND
+ ((OR (NOT (CONSP |bfVar#1|)) (PROGN (SETQ |x| (CAR |bfVar#1|)) NIL))
+ (RETURN |bfVar#2|))
+ ((NULL |bfVar#2|) (SETQ |bfVar#2| #1=(CONS (FUNCALL |fun| |x|) NIL))
+ (SETQ |bfVar#3| |bfVar#2|))
+ (T (RPLACD |bfVar#3| #1#) (SETQ |bfVar#3| (CDR |bfVar#3|))))
+ (SETQ |bfVar#1| (CDR |bfVar#1|)))))
+
+(DEFUN |listMap!| (|l| |fun|)
+ (PROGN
+ (LET ((|xs| |l|))
+ (LOOP
+ (COND ((NOT (CONSP |xs|)) (RETURN NIL))
+ (T (RPLACA |xs| (FUNCALL |fun| (CAR |xs|)))))
+ (SETQ |xs| (CDR |xs|))))
+ |l|))
+
(DEFUN |symbolAssoc| (|s| |l|)
(LET* (|x|)
(LOOP