1
Fork 0
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:
Andy Wingo 2014-03-16 19:58:30 +01:00
parent ed59b70a54
commit f883ae59a0

View file

@ -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)