Blob


1 (define (non-num-members as)
2 (filter (lambda (x) (not (number? x)))
3 as))
4 (define (num-members as)
5 (filter number? as))
6 (define (more-than-one-number? as)
7 (let ((nums (num-members as)))
8 (if (or (null? nums) (null? (cdr nums)))
9 false
10 true)))
11 (define (zero-is-the-only-number? as)
12 (let ((nums (num-members as)))
13 (if (null? nums)
14 false
15 (and (= (car nums) 0) (null? (cdr nums))))))
17 (define (make-sum . as)
18 (cond ((null? as) 0)
19 ((null? (cdr as)) (car as))
20 ((null? (non-num-members as)) (apply + as))
21 ((more-than-one-number? as)
22 (apply make-sum
23 (append (non-num-members as)
24 (list (apply + (num-members as))))))
25 ((zero-is-the-only-number? as)
26 (apply make-sum (non-num-members as)))
27 (else (append '(+) as))))
28 (define (make-product . ms)
29 (cond ((null? ms) 1)
30 ((null? (cdr ms)) (car ms))
31 ((null? (non-num-members ms)) (apply * ms))
32 ((more-than-one-number? ms)
33 (apply make-product
34 (append (non-num-members ms)
35 (list (apply * (num-members ms))))))
36 ((zero-is-the-only-number? ms) 0)
37 ((one-is-the-only-number? ms)
38 (apply make-product (non-num-members ms)))
39 (else (append '(*) ms))))
42 (define (augend s)
43 (apply make-sum (cddr s)))
44 (define (multiplicand p)
45 (apply make-product (cddr p)))