--- slib/srfi-1.scm 2008-12-08 03:29:50.000000000 +0100 +++ slib/srfi-1.scm 2012-10-31 14:43:00.932721359 +0100 @@ -234,6 +234,13 @@ z (apply fold (cons* f (apply f (append! (map car l) (list z))) (map cdr l))))) + +(define (fold-left f z l1 . l) + (set! l (cons l1 l)) + (if (any null? l) + z + (apply fold-left (cons* f (apply f (cons z (map car l))) + (map cdr l))))) ;;@args kons knil clist1 clist2 ... (define (fold-right f z l1 . l) (set! l (cons l1 l)) @@ -247,6 +254,18 @@ z (let ((tail (cdr l))) (pair-fold f (f l z) tail)))) +; good pair-fold-left now +(define (pair-fold-left f z l) ;XXX should be multi-arg + (let rec ((lis l) + (rlis #f) + (last #f) + (ans z)) + (if (null? lis) + ans + (let ((new (list (car lis)))) + (if last (set-cdr! last new) (set! rlis new)) + (rec (cdr lis) rlis new (f ans rlis)))) + )) ;;@args kons knil clist1 clist2 ... (define (pair-fold-right f z l) ;XXX should be multi-arg (if (null? l) @@ -264,6 +283,17 @@ ridentity (fold f (car list) (cdr list))))) args)))) + +(define reduce-left + (let ((comlist-reduce reduce-left)) + (lambda args + (apply (if (= 2 (length args)) + comlist-reduce + (lambda (f ridentity list) + (if (null? list) + ridentity + (fold-left f (car list) (cdr list))))) + args)))) (define (reduce-right f ridentity list) (if (null? list)