diff --git a/collects/srfi/14/char-set.ss b/collects/srfi/14/char-set.ss index b5fd04d254..30acda81c6 100644 --- a/collects/srfi/14/char-set.ss +++ b/collects/srfi/14/char-set.ss @@ -273,14 +273,17 @@ (define char-set-diff+intersection (case-lambda - [(cs1 cs2) - (let-values ([(cs1^cs2 cs1-cs2 cs2-cs1) (split (char-set-set cs1) (char-set-set cs2))]) - (values (make-char-set cs1-cs2) - (make-char-set cs1^cs2)))] - [(cs1 cs2 . more) - (let-values ([(d i) (char-set-diff+intersection cs1 cs2)]) - (values (apply char-set-difference d more) - (apply char-set-intersection i more)))])) + [(cs) + (values (char-set-difference cs) + (char-set-intersection cs (char-set-union)))] + [(cs1 cs2) + (let-values ([(cs1^cs2 cs1-cs2 cs2-cs1) (split (char-set-set cs1) (char-set-set cs2))]) + (values (make-char-set cs1-cs2) + (make-char-set cs1^cs2)))] + [(cs1 cs2 . more) + (let-values ([(d i) (char-set-diff+intersection cs1 cs2)]) + (values (apply char-set-difference d more) + (apply char-set-intersection i more)))])) (define char-set-adjoin! char-set-adjoin) (define char-set-delete! char-set-delete) @@ -432,13 +435,13 @@ [char-set-union char-sets0/c] [char-set-union! char-sets/c] [char-set-intersection char-sets0/c] - [char-set-intersection! char-sets/c] + [char-set-intersection! char-sets0/c] [char-set-difference char-sets/c] - [char-set-difference! char-sets+/c] + [char-set-difference! char-sets/c] [char-set-xor char-sets0/c] [char-set-xor! char-sets/c] - [char-set-diff+intersection char-sets+/c] - [char-set-diff+intersection! char-sets+/c]) + [char-set-diff+intersection char-sets/c] + [char-set-diff+intersection! char-sets/c]) (provide char-set:lower-case char-set:upper-case diff --git a/collects/tests/mzscheme/char-set.ss b/collects/tests/mzscheme/char-set.ss index 1c45b69c99..d586397ef0 100644 --- a/collects/tests/mzscheme/char-set.ss +++ b/collects/tests/mzscheme/char-set.ss @@ -251,8 +251,10 @@ (char-set #\v #\b))) (test #t char-set= cs1 (char-set-diff (char-set #\U #\t #\a #\h #\v #\w) (char-set #\v #\b) - (char-set #\w))))]) + (char-set #\w))) + (test #t char-set= cs1 (char-set-diff (char-set #\U #\t #\a #\h))))]) (go char-set-difference) + (go char-set-difference!) (go char-set-difference!)) (let ([go @@ -267,7 +269,12 @@ (let ([go (lambda (char-set-diff+i) - (test #t andmap char-set= (list cs1 (char-set #\v)) + (test #t andmap char-set= (list cs1 (char-set-union)) + (call-with-values + (lambda () + (char-set-diff+i (char-set #\U #\t #\a #\h))) + list)) + (test #t andmap char-set= (list cs1 (char-set #\v)) (call-with-values (lambda () (char-set-diff+i (char-set #\U #\t #\a #\h #\v) @@ -281,6 +288,7 @@ (char-set #\w))) list)))]) (go char-set-diff+intersection) + (go char-set-diff+intersection) (go char-set-diff+intersection!)) )