1 (define (make-sum a1 a2)
2 (cond ((=number? a1 0) a2)
4 ((and (number? a1) (number? a2)) (+ a1 a2))
5 (else (list a1 '+ a2))))
6 (define (make-product m1 m2)
7 (cond ((or (=number? m1 0) (=number? m2 0)) 0)
10 ((and (number? m1) (number? m2)) (* m1 m2))
11 (else (list m1 '* m2))))
13 (and (pair? x) (eq? (cadr x) '+)))
14 (define (addend s) (car s))
15 (define (augend s) (caddr s))
17 (and (pair? x) (eq? (cadr x) '*)))
18 (define (multiplier p) (car p))
19 (define (multiplicand p) (caddr p))
20 (define (non-num-members as)
21 (filter (lambda (x) (not (number? x))) as))
22 (define (num-members as)
24 (define (more-than-one-number? as)
25 (let ((nums (num-members as)))
26 (if (or (null? nums) (null? (cdr nums)))
29 (define (zero-is-the-only-number? as)
30 (let ((nums (num-members as)))
33 (and (= (car nums) 0) (null? (cdr nums))))))
34 (define (one-is-the-only-number? as)
35 (let ((nums (num-members as)))
38 (and (= (car nums) 1) (null? (cdr nums))))))
39 (define (insert-signs result items sign)
40 (cond ((null? items) result)
42 (insert-signs (list (car items)) (cdr items) sign))
43 (else (insert-signs (append result (list sign (car items)))
46 (define (make-sum . as)
48 ((null? (cdr as)) (car as))
49 ((null? (non-num-members as)) (apply + as))
50 ((more-than-one-number? as)
52 (append (non-num-members as)
53 (list (apply + (num-members as))))))
54 ((zero-is-the-only-number? as)
55 (apply make-sum (non-num-members as)))
56 (else (insert-signs '() as '+))))
57 (define (make-product . ms)
59 ((null? (cdr ms)) (car ms))
60 ((null? (non-num-members ms)) (apply * ms))
61 ((more-than-one-number? ms)
62 (apply make-product (append (non-num-members ms)
63 (list (apply * (num-members ms))))))
64 ((zero-is-the-only-number? ms) 0)
65 ((one-is-the-only-number? ms)
66 (apply make-product (non-num-members ms)))
67 (else (insert-signs '() ms '*))))
69 (cond ((not (pair? x)) #f)
73 (cond ((not (pair? x)) #f)
74 ((and (not (sum? x)) (member '* x)) true)
77 (let* ((index (list-index (lambda (x) (eq? x '+)) s))
83 (let* ((index (list-index (lambda (x) (eq? x '+)) s))
84 (b (drop s (+ index 1))))
88 (define (multiplier p)
89 (let* ((index (list-index (lambda (x) (eq? x '*)) p))
94 (define (multiplicand p)
95 (let* ((index (list-index (lambda (x) (eq? x '*)) p))
96 (b (drop p (+ index 1))))
100 (multiplier '(x * y * (z + 2)))