gcl.git - GNU Common Lisp

index : gcl.git
GNU Common Lisp
summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamm Maguire <camm@transcendence.maguirefamily.org>2025年04月21日 13:36:45 -0400
committerCamm Maguire <camm@transcendence.maguirefamily.org>2025年04月21日 13:36:45 -0400
commit9e1798359bf6bdce9a1de2673e29ece50d8cfe65 (patch)
tree159eee9d5f8946b8e063382d21ca89a7fc041468
parentce051f8942a03156f6679e77aa2f6727ee4c69ee (diff)
downloadgcl-9e1798359bf6bdce9a1de2673e29ece50d8cfe65.tar.gz
minimize some consing in listlib functions
Diffstat
-rw-r--r--gcl/lsp/gcl_listlib.lsp 22
1 files changed, 14 insertions, 8 deletions
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)
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月07日 15:22:41 +0000

AltStyle によって変換されたページ (->オリジナル) /