Code Review
Compare your solutions
#| BEGIN (Write your solution here) |#
;; -- sum derivative package --
(define (install-sum-package)
(put 'deriv '+
(lambda (operands var)
(let ((exp (cons '+ operands)))
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var))))))
;; -- product derivative package --
(define (install-product-package)
(put 'deriv '*
(lambda (operands var)
(let ((exp (cons '* operands)))
(make-sum
(make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp)))))))
;; -- sum --
(define (make-sum . ops)
(let ((symbols (filter (lambda (x) (not (number? x))) ops))
(number (foldr + 0 (filter number? ops))))
(cond ((null? symbols) number)
((and (= number 0) (null? (cdr symbols))) (car symbols))
((= number 0) (cons '+ symbols))
((null? (cdr symbols)) (list '+ number (car symbols)))
(else (cons '+ (cons number symbols))))))
(define (sum? x)
(and (pair? x) (eq? (car x) '+)))
(define (addend s) (cadr s))
(define (augend s)
(if (null? (cdddr s))
(caddr s)
(cons '+ (cddr s))))
;; -- product --
(define (make-product . ops)
(let ((symbols (filter (lambda (x) (not (number? x))) ops))
(number (foldr * 1 (filter number? ops))))
(cond ((null? symbols) number)
((= number 0) 0)
((and (= number 1) (null? (cdr symbols))) (car symbols))
((= number 1) (cons '* symbols))
((null? (cdr symbols)) (list '* number (car symbols)))
(else (cons '* (cons number symbols))))))
(define (product? x)
(and (pair? x) (eq? (car x) '*)))
(define (multiplier p) (cadr p))
(define (multiplicand p)
(if (null? (cdddr p))
(caddr p)
(cons '* (cddr p))))
#| END |#