1 (define (test-case actual expected)
10 (define (filter predicate sequence)
11 (cond ((null? sequence) '())
12 ((predicate (car sequence))
14 (filter predicate (cdr sequence))))
15 (else (filter predicate (cdr sequence)))))
16 (define (accumulate op initial sequence)
20 (accumulate op initial (cdr sequence)))))
21 (define (enumerate-interval low high)
24 (cons low (enumerate-interval (1+ low) high))))
25 (define (enumerate-tree tree)
26 (cond ((null? tree) '())
27 ((not (pair? tree)) (list tree))
28 (else (append (enumerate-tree (car tree))
29 (enumerate-tree (cdr tree))))))
31 ;; Exercise 2.33. Fill in the missing expressions to complete the following definitions of some basic list-manipulation operations as accumulations:
33 (define (map p sequence)
34 (accumulate (lambda (x y)
39 (test-case (map square '()) '())
40 (test-case (map square '(1)) '(1))
41 (test-case (map square '(1 2 3 4 5)) '(1 4 9 16 25))
43 (define (append seq1 seq2)
48 (test-case (append '() '()) '())
49 (test-case (append '(1 2 3) '()) '(1 2 3))
50 (test-case (append '() '(4 5 6)) '(4 5 6))
51 (test-case (append '(1 2 3) '(4 5 6)) '(1 2 3 4 5 6))
52 (test-case (append '((1 (2)) 3) '((4 ((5)) 6))) '((1 (2)) 3 (4 ((5)) 6)))
54 (define (length sequence)
55 (accumulate (lambda (first accum)
60 (test-case (length '()) 0)
61 (test-case (length '(1 2 3)) 3)
62 (test-case (length '((1 (2)) 3 (4 ((5)) 6))) 3)