diff options
Diffstat (limited to 'comlist.scm')
-rw-r--r-- | comlist.scm | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/comlist.scm b/comlist.scm index 1751c7f..8ecf525 100644 --- a/comlist.scm +++ b/comlist.scm @@ -31,7 +31,7 @@ (define (comlist:copy-list lst) (append lst '())) -(define (comlist:adjoin e l) (if (memq e l) l (cons e l))) +(define (comlist:adjoin e l) (if (memv e l) l (cons e l))) (define (comlist:union l1 l2) (cond ((null? l1) l2) @@ -176,13 +176,22 @@ ((car args) #t) (else (apply comlist:or? (cdr args))))) -; Checks to see if a list has any duplicates. +;;; Checks to see if a list has any duplicate MEMBERs. (define (comlist:has-duplicates? lst) (cond ((null? lst) #f) ((member (car lst) (cdr lst)) #t) (else (comlist:has-duplicates? (cdr lst))))) -(define (comlist:list* x . y) +;;; remove duplicates of MEMBERs of a list +(define (comlist:remove-duplicates lst) + (letrec ((rem-dup + (lambda (lst nlst) + (cond ((null? lst) nlst) + ((member (car lst) nlst) (rem-dup (cdr lst) nlst)) + (else (rem-dup (cdr lst) (cons (car lst) nlst))))))) + (rem-dup lst '()))) + +(define (comlist:list* x . y) (define (list*1 x) (if (null? (cdr x)) (car x) @@ -283,7 +292,7 @@ ((equal? obj (car list)) (delete (cdr list))) (else (set-cdr! list (delete (cdr list))) - list)))) + list)))) (define (comlist:delete-if pred list) (let delete-if ((list list)) @@ -291,7 +300,7 @@ ((pred (car list)) (delete-if (cdr list))) (else (set-cdr! list (delete-if (cdr list))) - list)))) + list)))) (define (comlist:delete-if-not pred list) (let delete-if ((list list)) @@ -299,7 +308,7 @@ ((not (pred (car list))) (delete-if (cdr list))) (else (set-cdr! list (delete-if (cdr list))) - list)))) + list)))) ;;; exports @@ -330,6 +339,7 @@ (define and? comlist:and?) (define or? comlist:or?) (define has-duplicates? comlist:has-duplicates?) +(define remove-duplicates comlist:remove-duplicates) (define delete-if-not comlist:delete-if-not) (define delete-if comlist:delete-if) |