diff options
author | Andy Wingo <wingo@pobox.com> | 2014-03-16 19:58:30 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-03-16 19:58:30 +0100 |
commit | f883ae59a021065798f5a60799cf44966df751fb (patch) | |
tree | da99d16dd03d25d5cdabe955ec94911aee2e15d7 /module/srfi/srfi-1.scm | |
parent | ed59b70a541bae95f1ff81f37eb083e791e98124 (diff) | |
download | guile-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.scm | 16 |
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) |