summaryrefslogtreecommitdiff
path: root/srfi/srfi-1.scm
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2005-04-01 23:47:42 +0000
committerKevin Ryde <user42@zip.com.au>2005-04-01 23:47:42 +0000
commit62a875000157f7dd1ff5309838a6d9f7a4092968 (patch)
tree375756471cbd765d817e2517598e43f2a794fa4c /srfi/srfi-1.scm
parent6507b8318928b553921cb93a284f0ecb90161ed4 (diff)
downloadguile-62a875000157f7dd1ff5309838a6d9f7a4092968.tar.gz
(lset-union): Rewrite to accumulate result by consing in
the order specified by the SRFI.
Diffstat (limited to 'srfi/srfi-1.scm')
-rw-r--r--srfi/srfi-1.scm20
1 files changed, 11 insertions, 9 deletions
diff --git a/srfi/srfi-1.scm b/srfi/srfi-1.scm
index 4ddf12d99..6137618cd 100644
--- a/srfi/srfi-1.scm
+++ b/srfi/srfi-1.scm
@@ -673,15 +673,17 @@
(lp (cdr l) (cons (car l) acc))))))
(define (lset-union = . rest)
- (let lp0 ((l rest) (acc '()))
- (if (null? l)
- (reverse! acc)
- (let lp1 ((ll (car l)) (acc acc))
- (if (null? ll)
- (lp0 (cdr l) acc)
- (if (member (car ll) acc (lambda (x y) (= y x)))
- (lp1 (cdr ll) acc)
- (lp1 (cdr ll) (cons (car ll) acc))))))))
+ (let ((acc '()))
+ (for-each (lambda (lst)
+ (if (null? acc)
+ (set! acc lst)
+ (for-each (lambda (elem)
+ (if (not (member elem acc
+ (lambda (x y) (= y x))))
+ (set! acc (cons elem acc))))
+ lst)))
+ rest)
+ acc))
(define (lset-intersection = list1 . rest)
(let lp ((l list1) (acc '()))