diff options
author | michele.simionato <devnull@localhost> | 2009-02-16 07:15:21 +0000 |
---|---|---|
committer | michele.simionato <devnull@localhost> | 2009-02-16 07:15:21 +0000 |
commit | ef43239a4c52f162e74b1576a1d1518254bc7008 (patch) | |
tree | fc3ae4f4ace6a1c724a41878874cc57f21b8baef /scheme | |
parent | 743c686b9c02bed88daffa36b524bd4892a63a6f (diff) | |
download | micheles-ef43239a4c52f162e74b1576a1d1518254bc7008.tar.gz |
Enhanced fold macro
Diffstat (limited to 'scheme')
-rw-r--r-- | scheme/aps/list-utils.sls | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/scheme/aps/list-utils.sls b/scheme/aps/list-utils.sls index 3aa9d8b..67afdfe 100644 --- a/scheme/aps/list-utils.sls +++ b/scheme/aps/list-utils.sls @@ -123,24 +123,28 @@ (define (append-unique eq? . lists) (remove-dupl eq? (apply append lists))) ;;END - + ;;FOLD (def-syntax fold - (syntax-match (left right is in) - (sub (fold left (acc is seed) (x in lst) expr) - #'(fold-left - (lambda (acc a) (let+ (x a) expr)) - seed lst)) - (sub (fold right (acc is seed) (x in lst) expr) - #'(fold-right - (lambda (a acc) (let+ (x a) expr)) - seed lst)) + (syntax-match (left right in) + (sub (fold left (acc seed) (x in lst) (x* in lst*) ... new-acc) + (local + (with-syntax (a a* ...) (generate-temporaries #'(x x* ...))) + #'(fold-left + (lambda (acc a a* ...) (let+ (x a) (x* a*) ... new-acc)) + seed lst lst* ...))) + (sub (fold right (acc seed) (x in lst) (x* in lst*) ... new-acc) + (local + (with-syntax (a a* ...) (generate-temporaries #'(x x* ...))) + #'(fold-right + (lambda (a a* ... acc) (let+ (x a) (x* a*) ... new-acc)) + seed lst lst* ...))) )) ;;END ;;FLATTEN (define (flatten lst) - (fold right (a is '()) (x in lst) + (fold right (a '()) (x in lst) (if (list? x) (append (flatten x) a) (cons x a)))) ;;END |