summaryrefslogtreecommitdiff
path: root/scheme
diff options
context:
space:
mode:
authormichele.simionato <devnull@localhost>2009-02-16 07:15:21 +0000
committermichele.simionato <devnull@localhost>2009-02-16 07:15:21 +0000
commitef43239a4c52f162e74b1576a1d1518254bc7008 (patch)
treefc3ae4f4ace6a1c724a41878874cc57f21b8baef /scheme
parent743c686b9c02bed88daffa36b524bd4892a63a6f (diff)
downloadmicheles-ef43239a4c52f162e74b1576a1d1518254bc7008.tar.gz
Enhanced fold macro
Diffstat (limited to 'scheme')
-rw-r--r--scheme/aps/list-utils.sls26
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