diff options
author | Andy Wingo <wingo@pobox.com> | 2014-04-01 20:52:15 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-04-01 20:52:15 +0200 |
commit | f082c5f30aeb5b94e3d4791c01bab321716600a3 (patch) | |
tree | 5a943a6d80bcd251b243e114dcff269dd638a06d /module/srfi/srfi-1.scm | |
parent | 545274a03578b5fa5270c629d704fb9f815517cf (diff) | |
download | guile-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.scm | 17 |
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) |