1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

srfi-1 lset-difference!: move from C to Scheme

* libguile/srfi-1.c (scm_srfi1_lset-difference_x): delete.
* libguile/srfi-1.h (scm_srfi1_lset-difference_x): delete.
* module/srfi/srfi-1.scm: add lset-difference!.
* test-suite/tests/srfi-1.test: extend lset-difference! tests to cover
lset-difference.
This commit is contained in:
Rob Browning 2024-07-17 23:12:14 -05:00
parent 3eb6afe738
commit 945c97b14d
4 changed files with 71 additions and 115 deletions

View file

@ -1350,6 +1350,30 @@ given REST parameters."
(check-arg procedure? = lset-intersection!)
(apply lset-intersection = list1 rest)) ; XXX:optimize
(define (lset-difference! = lset . removals)
"Return @var{lst} with any elements in the lists in @var{removals}
removed (ie.@: subtracted). For only one @var{lst} argument, just that
list is returned.
The given @var{equal} procedure is used for comparing elements, called
as @code{(@var{equal} elem1 elemN)}. The first argument is from
@var{lst} and the second from one of the subsequent lists. But exactly
which calls are made and in what order is unspecified.
@example
(lset-difference! eqv? (list 'x 'y)) @result{} (x y)
(lset-difference! eqv? (list 1 2 3) '(3 1)) @result{} (2)
(lset-difference! eqv? (list 1 2 3) '(3) '(2)) @result{} (1)
@end example
@code{lset-difference!} may modify @var{lst} to form its result."
(check-arg procedure? = lset-intersection!)
(cond
((null? lset) lset)
((null? removals) lset)
(else (remove! (lambda (x) (any (lambda (s) (member x s =)) removals))
lset))))
(define (lset-xor! = . rest)
(check-arg procedure? = lset-xor!)
(apply lset-xor = rest)) ; XXX:optimize