The attached patch fixes ‘map’ with several lists so that it stops as
soon as one of ends of list is reached, not just the first list’s end.

Unfortunately I was unable to test it because I fail to bootstrap Bigloo.

Thanks,
Ludo’.

diff -r fb869ad7a067 recette/list.scm
--- a/recette/list.scm	Mon Mar 03 12:12:08 2014 +0100
+++ b/recette/list.scm	Fri Apr 25 11:35:55 2014 +0200
@@ -47,6 +47,8 @@
    (test "map.6" (map (lambda (x) x) '()) '())
    (test "map.7" (map car '()) '())
    (test "map.8" (map car '((1))) '(1))
+   (test "map.9" (map + '(1 2 3 4 5 6) '(1 2 3)) '(2 4 6))
+   (test "map.10" (map + '(1 2 3 4 5 6) '(1 2 3) '(1)) '(3))
    (test "append-map" (append-map (lambda (x) (list x (- x))) '(1 3 8))
 	 '(1 -1 3 -3 8 -8))
    (test "append-map!" (append-map! (lambda (x) (list x (- x))) '(1 3 8))
diff -r fb869ad7a067 runtime/Ieee/control.scm
--- a/runtime/Ieee/control.scm	Mon Mar 03 12:12:08 2014 +0100
+++ b/runtime/Ieee/control.scm	Fri Apr 25 11:35:55 2014 +0200
@@ -101,6 +101,13 @@
 ;*    map ...                                                          */
 ;*---------------------------------------------------------------------*/
 (define (map f . l)
+   (define (find pred l)
+      (let loop ((l l))
+         (match-case l
+            (() #f)
+            ((head . tail)
+             (or (pred head) (loop tail))))))
+
    (cond
       ((null? l)
        '())
@@ -108,7 +115,7 @@
        (map-2 f (car l)))
       (else
        (let loop ((l l))
-	  (if (null? (car l))
+          (if (find null? l)
 	      '()
 	      (cons (apply f (map-2 car l))
 		    (loop (map-2 cdr l))))))))

Reply via email to