mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-09 21:40:33 +02:00
Optimize srfi-1 for-each with two lists.
* module/srfi/srfi-1.scm (for-each): Optimize for the two-list case.
This commit is contained in:
parent
ed59b70a54
commit
f883ae59a0
1 changed files with 16 additions and 0 deletions
|
@ -612,6 +612,22 @@ has just one element then that's the return value."
|
||||||
(f (car l))
|
(f (car l))
|
||||||
(for-each1 (cdr 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)
|
((f l1 . rest)
|
||||||
(check-arg procedure? f for-each)
|
(check-arg procedure? f for-each)
|
||||||
(let ((len (fold (lambda (ls len)
|
(let ((len (fold (lambda (ls len)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue