author | Camm Maguire <camm@transcendence.maguirefamily.org> | 2025年04月21日 13:36:45 -0400 |
---|---|---|
committer | Camm Maguire <camm@transcendence.maguirefamily.org> | 2025年04月21日 13:36:45 -0400 |
commit | 9e1798359bf6bdce9a1de2673e29ece50d8cfe65 (patch) | |
tree | 159eee9d5f8946b8e063382d21ca89a7fc041468 | |
parent | ce051f8942a03156f6679e77aa2f6727ee4c69ee (diff) | |
download | gcl-9e1798359bf6bdce9a1de2673e29ece50d8cfe65.tar.gz |
-rw-r--r-- | gcl/lsp/gcl_listlib.lsp | 22 |
diff --git a/gcl/lsp/gcl_listlib.lsp b/gcl/lsp/gcl_listlib.lsp index 914fbf8e2..d12c3bfe0 100644 --- a/gcl/lsp/gcl_listlib.lsp +++ b/gcl/lsp/gcl_listlib.lsp @@ -371,7 +371,8 @@ (defseq union (nil (l1 l2) :list t) (let (rp) - (prog1 (or (mapcan (lambda (x) + (prog1 (or (unless l2 l1) + (mapcan (lambda (x) (unless (member (key x) l2 :test #'test) (setq rp (cons x nil)))) l1) @@ -380,21 +381,26 @@ (defseq set-difference (nil (l1 l2) :list t) - (mapcan (lambda (x) + (if l2 + (mapcan (lambda (x) (unless (member (key x) l2 :test #'test) (cons x nil))) - l1)) + l1) + l1)) (defseq set-exclusive-or (nil (l1 l2) :list t) - (let (rp (rr (copy-list l2))) - (prog1 (or (mapcan (lambda (x &aux (k (key x))) + (let (rp tmp n2) + (declare (dynamic-extent tmp)) + (or (unless l2 l1) + (prog1 (mapcan (lambda (x &aux (k (key x))) (if (member k l2 :test #'test) - (unless (setq rr (delete k rr :test #'test))) + (unless (push k tmp)) (setq rp (cons x nil)))) l1) - rr) - (when rp (rplacd rp rr))))) + (setq n2 (set-difference l2 tmp :test (lambda (x y) (funcall #'test y x)))) + (when rp (rplacd rp n2))) + n2))) (defseq nintersection (nil (l1 l2) :list t) (let (r rp) |