46 lines
916 B
Scheme
46 lines
916 B
Scheme
|
|
;; (define list*
|
|
;; (lambda (fst . rest)
|
|
;; (let f ([fst fst] [rest rest])
|
|
;; (cond
|
|
;; [(null? rest) fst]
|
|
;; [else
|
|
;; (cons fst (f (car rest) (cdr rest)))]))))
|
|
|
|
(define (remq x ls)
|
|
(cond
|
|
[(null? ls) '()]
|
|
[(eq? x (car ls)) (cdr ls)]
|
|
[else
|
|
(let ([t (remq x (cdr ls))])
|
|
(cond
|
|
[(eq? t (cdr ls)) ls]
|
|
[else (cons (car ls) t)]))]))
|
|
|
|
(define (singleton x) (list x))
|
|
|
|
(define (union s1 s2)
|
|
(define (add* s1 s2)
|
|
(cond
|
|
[(null? s1) s2]
|
|
[else (add (car s1) (add* (cdr s1) s2))]))
|
|
(define (add x s)
|
|
(cond
|
|
[(memq x s) s]
|
|
[else (cons x s)]))
|
|
(cond
|
|
[(null? s1) s2]
|
|
[(null? s2) s1]
|
|
[else (add* s1 s2)]))
|
|
|
|
(define (difference s1 s2)
|
|
(define (rem* s1 s2)
|
|
(cond
|
|
[(null? s1) s2]
|
|
[else (remq (car s1) (rem* (cdr s1) s2))]))
|
|
(cond
|
|
[(null? s1) '()]
|
|
[(null? s2) s1]
|
|
[else (rem* s2 s1)]))
|
|
|