~ chicken-core (chicken-5) 5846115e0b9c7a09525df62bc23bebf414c72b96


commit 5846115e0b9c7a09525df62bc23bebf414c72b96
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Jan 25 21:49:05 2015 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sun Jan 25 21:49:05 2015 +0100

    Added more stuff to mini-srfi-1.scm

diff --git a/mini-srfi-1.scm b/mini-srfi-1.scm
index 9c21041b..da82d6cd 100644
--- a/mini-srfi-1.scm
+++ b/mini-srfi-1.scm
@@ -26,22 +26,40 @@
 
 
 (declare 
-  (hide take split-at! append-map every any))
+  (hide take span drop partition split-at append-map every any cons* concatenate delete
+	first second third fourth alist-cons delete-duplicates fifth
+	filter filter-map unzip1 last list-index lset-adjoin lset-difference
+	lset-union lset-intersection list-tabulate lset<= lset=))
 
 
+(define (partition pred lst)
+  (let loop ((yes '()) (no '()) (lst lst))
+    (cond ((null? lst) (values (reverse yes) (reverse no)))
+	  ((pred (car lst)) (loop (cons (car lst) yes) no (cdr lst)))
+	  (else (loop yes (cons (car lst) no) (cdr lst))))))
+
+(define (span pred lst)
+  (let loop ((lst lst) (head '()))
+    (cond ((null? lst) (values (reverse head) lst))
+	  ((pred (car lst)) (loop (cdr lst) (cons (car lst) head)))
+	  (else (values (reverse head) lst)))))
+
 (define (take lst n)
   (if (fx<= n 0)
       lst
       (cons (car lst) (take lst (fx- n 1)))))
 
-(define (split-at! lst n)
-  (let loop ((n n) (prev #f) (node lst))
+(define (drop lst n)
+  (let loop ((lst lst) (n n))
+    (if (fx<= n 0)
+	lst
+	(loop (cdr lst) (fx- n 1)))))
+
+(define (split-at lst n)
+  (let loop ((n n) (prev '()) (node lst))
     (if (fx<= n 0)
-	(cond (prev
-	       (set-cdr! prev '())
-	       (values lst node))
-	      (else values '() lst))
-	(loop (fx- n 1) node (cdr node)))))
+	(values (reverse prev) node)
+	(loop (fx- n 1) (cons (car node) prev) (cdr node)))))
 
 (define (append-map proc lst1 . lsts)
   (if (null? lsts)
@@ -63,3 +81,106 @@
     (cond ((null? lst) #f)
 	  ((pred (car lst)))
 	  (else (loop (cdr lst))))))
+
+(define (cons* x1 . xs)
+  (let loop ((x x1) (rest xs))
+    (if (null? rest)
+	x
+	(cons x (loop (car rest) (cdr rest))))))
+
+(define (concatenate lst)
+  (let loop ((lst lst))
+    (if (null? lst) 
+	'()
+	(append (car lst) (loop (cdr lst))))))
+
+(define (delete x lst)
+  (let loop ((lst lst))
+    (cond ((null? lst) lst)
+	  ((eq? x (car lst)) (cdr lst))
+	  (else (cons (car lst) (loop (cdr lst)))) ) ) )
+
+(define (first x) (car x))
+(define (second x) (cadr x))
+(define (third x) (caddr x))
+(define (fourth x) (cadddr x))
+(define (fifth x) (car (cddddr x)))
+
+(define (delete-duplicates lst)
+  (let loop ((lst lst))
+    (if (null? lst)
+	lst
+	(let* ((x (car lst))
+	       (tail (cdr lst))
+	       (new-tail (loop (delete/eq? x tail))))
+	  (if (eq? tail new-tail) 
+	      lst
+	      (cons x new-tail))))))
+
+(define (alist-cons x y z) (cons (cons x y) z))
+
+(define (filter pred lst)
+  (foldr (lambda (x r) (if (pred x) (cons x r) r)) '() lst))
+
+(define (filter-map pred lst)
+  (foldr (lambda (x r) 
+	   (cond ((pred x) => (lambda (y) (cons y r)))
+		 (else r)))
+	 '()
+	 lst))
+
+(define (unzip1 lst) (map (lambda (x) (car x)) lst))
+
+(define (last lst)
+  (let loop ((lst lst))
+    (if (null? (cdr lst))
+	(car lst)
+	(loop (cdr lst)))))
+
+(define (list-index pred lst)
+  (let loop ((i 0) (lst lst))
+    (cond ((null? lst) #f)
+	  ((pred (car lst)) i)
+	  (else (loop (fx+ i 1) (cdr lst))))))
+
+(define (lset-adjoin lst . vals)
+  (let loop ((vals vals) (lst lst))
+    (cond ((null? vals) lst)
+	  ((memq (car vals) lst) (loop (cdr vals) lst))
+	  (else (loop (cdr vals) (cons (car vals) lst))))))
+
+(define (lset-difference ls . lss)
+  (foldl
+   (lambda (ls lst)
+     (filter (lambda (x) (not (memq x lst))) ls))
+   ls
+   lss))
+
+(define (lset-union ls . lss)
+  (foldl
+   (lambda (ls lst)
+     (foldl
+      (lambda (ls x)
+	(if (any (lambda (y) (eq? y x)) ls)
+	    ls
+	    (cons x ls)))
+      ls lst))
+   '() lss))
+
+(define (lset-intersection ls1 . lss)
+  (filter (lambda (x)
+	    (every (lambda (lis) (memq x lis)) lss))
+	  ls1))
+  
+(define (list-tabulate n proc)
+  (let loop ((i 0))
+    (if (fx>= i n)
+	'()
+	(cons (proc i) (loop (fx+ i 1))))))
+
+(define (lset<= s1 s2)
+  (every (lambda (s) (memq s s2)) s1))
+
+(define (lset= s1 s2)
+  (and (eq? (length s1) (length s2))
+       (every (lambda (s) (memq s s2)) s1)))
Trap