summaryrefslogtreecommitdiff
path: root/slsets.scm
diff options
context:
space:
mode:
authorPeter Bex <peter@more-magic.net>2025-08-06 14:20:38 +0200
committerPeter Bex <peter@more-magic.net>2025-08-06 14:20:38 +0200
commitad8dd2aceaab8ed36b3600eabf5547224f35db99 (patch)
treec5c932512ac50044f170c9d3b882be7d4d02aa42 /slsets.scm
parent23a9fe858c01c6905486e1a87ac46553482e3802 (diff)
downloadslsets-master.tar.gz
Make sure lset-adjoin removes markings on the adjoined elementsHEADmaster
Add a test to ensure this won't happen again.
Diffstat (limited to 'slsets.scm')
-rw-r--r--slsets.scm17
1 files changed, 11 insertions, 6 deletions
diff --git a/slsets.scm b/slsets.scm
index 92d7356..4b83cf4 100644
--- a/slsets.scm
+++ b/slsets.scm
@@ -78,12 +78,17 @@
(define (slset-adjoin lst . els)
(with-marked-list lst
(lambda (m)
- (let lp ((lst lst)
- (els els))
- (cond ((null? els) lst)
- ((marked? (car els) m) (lp lst (cdr els)))
- (else (mark! (car els) m)
- (lp (cons (car els) lst) (cdr els))))))))
+ (dynamic-wind
+ void
+ (lambda ()
+ (let lp ((lst lst)
+ (els els))
+ (cond ((null? els) lst)
+ ((marked? (car els) m) (lp lst (cdr els)))
+ (else (mark! (car els) m)
+ (lp (cons (car els) lst) (cdr els))))))
+ (lambda ()
+ (unmark-list! els m))))))
(define (slset-difference lst . lsts)
(let lp ((lsts lsts)