summaryrefslogtreecommitdiff
path: root/module/srfi/srfi-1.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2014-03-16 19:58:30 +0100
committerAndy Wingo <wingo@pobox.com>2014-03-16 19:58:30 +0100
commitf883ae59a021065798f5a60799cf44966df751fb (patch)
treeda99d16dd03d25d5cdabe955ec94911aee2e15d7 /module/srfi/srfi-1.scm
parented59b70a541bae95f1ff81f37eb083e791e98124 (diff)
downloadguile-f883ae59a021065798f5a60799cf44966df751fb.tar.gz
Optimize srfi-1 for-each with two lists.
* module/srfi/srfi-1.scm (for-each): Optimize for the two-list case.
Diffstat (limited to 'module/srfi/srfi-1.scm')
-rw-r--r--module/srfi/srfi-1.scm16
1 files changed, 16 insertions, 0 deletions
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm
index fd0b55e9e..c7c1f8dee 100644
--- a/module/srfi/srfi-1.scm
+++ b/module/srfi/srfi-1.scm
@@ -612,6 +612,22 @@ has just one element then that's the return value."
(f (car l))
(for-each1 (cdr l)))))
+ ((f l1 l2)
+ (check-arg procedure? f for-each)
+ (let* ((len1 (length+ l1))
+ (len2 (length+ l2))
+ (len (if (and len1 len2)
+ (min len1 len2)
+ (or len1 len2))))
+ (unless len
+ (scm-error 'wrong-type-arg "for-each"
+ "Args do not contain a proper (finite) list: ~S"
+ (list (list l1 l2)) #f))
+ (let for-each2 ((l1 l1) (l2 l2) (len len))
+ (unless (zero? len)
+ (f (car l1) (car l2))
+ (for-each2 (cdr l1) (cdr l2) (1- len))))))
+
((f l1 . rest)
(check-arg procedure? f for-each)
(let ((len (fold (lambda (ls len)