mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 19:50:24 +02:00
Optimize two-list srfi-1 map
* module/srfi/srfi-1.scm (map): Optimize the two-list variant.
This commit is contained in:
parent
545274a035
commit
f082c5f30a
1 changed files with 17 additions and 0 deletions
|
@ -572,6 +572,23 @@ has just one element then that's the return value."
|
||||||
(map1 (cdr in) (cons (f (car in)) out))
|
(map1 (cdr in) (cons (f (car in)) out))
|
||||||
(reverse! out))))
|
(reverse! out))))
|
||||||
|
|
||||||
|
((f l1 l2)
|
||||||
|
(check-arg procedure? f map)
|
||||||
|
(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 "map"
|
||||||
|
"Args do not contain a proper (finite) list: ~S"
|
||||||
|
(list (list l1 l2)) #f))
|
||||||
|
(let map2 ((l1 l1) (l2 l2) (out '()) (len len))
|
||||||
|
(if (zero? len)
|
||||||
|
(reverse! out)
|
||||||
|
(map2 (cdr l1) (cdr l2)
|
||||||
|
(cons (f (car l1) (car l2)) out) (1- len))))))
|
||||||
|
|
||||||
((f l1 . rest)
|
((f l1 . rest)
|
||||||
(check-arg procedure? f map)
|
(check-arg procedure? f map)
|
||||||
(let ((len (fold (lambda (ls len)
|
(let ((len (fold (lambda (ls len)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue