summaryrefslogtreecommitdiff
path: root/module/srfi/srfi-1.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2014-04-01 20:52:15 +0200
committerAndy Wingo <wingo@pobox.com>2014-04-01 20:52:15 +0200
commitf082c5f30aeb5b94e3d4791c01bab321716600a3 (patch)
tree5a943a6d80bcd251b243e114dcff269dd638a06d /module/srfi/srfi-1.scm
parent545274a03578b5fa5270c629d704fb9f815517cf (diff)
downloadguile-f082c5f30aeb5b94e3d4791c01bab321716600a3.tar.gz
Optimize two-list srfi-1 map
* module/srfi/srfi-1.scm (map): Optimize the two-list variant.
Diffstat (limited to 'module/srfi/srfi-1.scm')
-rw-r--r--module/srfi/srfi-1.scm17
1 files changed, 17 insertions, 0 deletions
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm
index 919d51274..5e859d1c2 100644
--- a/module/srfi/srfi-1.scm
+++ b/module/srfi/srfi-1.scm
@@ -572,6 +572,23 @@ has just one element then that's the return value."
(map1 (cdr in) (cons (f (car in)) 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)
(check-arg procedure? f map)
(let ((len (fold (lambda (ls len)