summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
Diffstat (limited to 'shared')
-rw-r--r--shared/lists.rkt26
1 files changed, 26 insertions, 0 deletions
diff --git a/shared/lists.rkt b/shared/lists.rkt
index d5cfc61..4f2184d 100644
--- a/shared/lists.rkt
+++ b/shared/lists.rkt
@@ -1,4 +1,8 @@
#lang racket
+(provide accumulate
+ accumulate-n
+ fold-right
+ fold-left)
(define (append list1 list2)
(if (null? list1)
list2
@@ -22,3 +26,25 @@
(if (null? (cdr l))
l
(last-pair (cdr l))))
+
+(define (accumulate op initial sequence)
+ (cond ((null? sequence) initial)
+ (else (op (car sequence)
+ (accumulate op initial (cdr sequence))))))
+
+(define (accumulate-n op init seqs)
+ (if (null? (car seqs))
+ '()
+ (cons (accumulate op init (map car seqs))
+ (accumulate-n op init (map cdr seqs)))))
+
+(define (fold-right op initial sequence)
+ (accumulate op initial sequence))
+
+(define (fold-left op initial sequence)
+ (define (iter result rest)
+ (if (null? rest)
+ result
+ (iter (op result (car rest))
+ (cdr rest))))
+ (iter initial sequence))