mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-20 22:29:16 +02:00
48 lines
1.5 KiB
Scheme
48 lines
1.5 KiB
Scheme
|
|
(define (lset<= eq . sets)
|
|
(if (null? sets)
|
|
#t
|
|
(let lp1 ((set1 (car sets)) (sets (cdr sets)))
|
|
(if (null? sets)
|
|
#t
|
|
(let ((set2 (car sets)))
|
|
(let lp2 ((ls set1))
|
|
(if (pair? ls)
|
|
(and (member (car set1) set2 eq) (lp2 (cdr ls)))
|
|
(lp1 set2 (cdr sets)))))))))
|
|
|
|
(define (lset= eq . sets)
|
|
(and (apply lset<= eq sets) (apply lset<= eq (reverse sets))))
|
|
|
|
(define (lset-adjoin eq set . elts)
|
|
(lset-union2 eq elts set))
|
|
|
|
(define (lset-union2 eq a b)
|
|
(if (null? b)
|
|
a
|
|
(lset-union2 (cdr b) (if (member (car b) a eq) a (cons (car b) a)))))
|
|
|
|
(define (lset-union eq . sets)
|
|
(reduce (lambda (a b) (lset-union2 eq a b)) '() sets))
|
|
|
|
(define (lset-intersection eq . sets)
|
|
(reduce (lambda (a b) (filter (lambda (x) (member x b eq)) a)) '() sets))
|
|
|
|
(define (lset-difference eq . sets)
|
|
(reduce (lambda (a b) (remove (lambda (x) (member x b eq)) a)) '() sets))
|
|
|
|
(define (lset-xor eq . sets)
|
|
(reduce (lambda (a b)
|
|
(append (filter (lambda (x) (member x b eq)) a)
|
|
(filter (lambda (x) (member x a eq)) b)))
|
|
'()
|
|
sets))
|
|
|
|
(define (lset-diff+intersection eq . sets)
|
|
(values (apply lset-difference eq sets) (apply lset-intersection eq sets)))
|
|
|
|
(define lset-diff+intersection! lset-diff+intersection)
|
|
(define lset-xor! lset-xor)
|
|
(define lset-difference! lset-difference)
|
|
(define lset-intersection! lset-intersection)
|
|
(define lset-union! lset-union)
|