Minor correction, SIXPIC_FSR1 and 2 did not work. Now they do.
[sixpic.git] / utilities.scm
blobb74975d395c02554cb32c6a6b466189836c42012
1 ;;; utilities
3 (define (interval n m) ; returns the list (n n+1 n+2 ... m)
4   (if (<= n m) (cons n (interval (+ n 1) m)) '()))
6 (define (keep f lst)
7   (cond ((null? lst)   '())
8         ((f (car lst)) (cons (car lst) (keep f (cdr lst))))
9         (else          (keep f (cdr lst)))))
11 (define (set-equal? s1 s2)
12   (and (eq? (diff s1 s2) '())
13        (eq? (diff s2 s1) '())))
15 (define (diff s1 s2)
16   (cond ((null? s1)         '())
17         ((memq (car s1) s2) (diff (cdr s1) s2))
18         (else               (cons (car s1) (diff (cdr s1) s2)))))
20 (define (intersection s1 s2)
21   (cond ((null? s1)         '())
22         ((memq (car s1) s2) (cons (car s1) (intersection (cdr s1) s2)))
23         (else               (intersection (cdr s1) s2))))
25 (define (union s1 s2)
26   (cond ((null? s1)         s2)
27         ((memq (car s1) s2) (union (cdr s1) s2))
28         (else               (cons (car s1) (union (cdr s1) s2)))))
30 (define (union-multi sets) (foldl union '() sets))
32 (define (foldl f base lst)
33   (if (null? lst)
34       base
35       (foldl f (f base (car lst)) (cdr lst))))
37 (define (pos-in-list x lst)
38   (let loop ((lst lst) (i 0))
39     (cond ((not (pair? lst)) #f)
40           ((eq? (car lst) x) i)
41           (else              (loop (cdr lst) (+ i 1))))))
43 (define (remove x lst)
44   (cond ((null? lst)
45          '())
46         ((eq? x (car lst))
47          (cdr lst))
48         (else
49          (cons (car lst)
50                (remove x (cdr lst))))))
52 (define (replace x y lst)
53   (cond ((null? lst)
54          '())
55         ((eq? x (car lst))
56          (cons y (cdr lst)))
57         (else
58          (cons (car lst)
59                (replace x y (cdr lst))))))
61 (define (last lst)
62   (cond ((null? lst)
63          #f)
64         ((null? (cdr lst))
65          (car lst))
66         (else (last (cdr lst)))))
68 (define (all-but-last lst)
69   (let loop ((lst lst)
70              (new '()))
71     (cond ((null? lst)
72            #f)
73           ((null? (cdr lst))
74            (reverse new))
75           (else (loop (cdr lst)
76                       (cons (car lst) new))))))