Код Ревью

Сравни свои решения

    #| 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 |#