SICP問題2.56

exponentiation?の定義

(define (exponentiation? x)
  (and (pair? x) (eq? (car x) '**)))

baseの定義

(define (base x) (cadr x))

exponentの定義

(define (exponent x) (caddr x))

make-exponentiationの定義

(define (make-exponentiation b e) 
  (cond ((=number? e 0) 1)
    ((=number? e 1) b)
        ; Web で他の人の答え見るとここはいらないっぽい
    ((and (number? b) (number? e)) (expt b e))
    (else (list '** b e))))

上記定義を追加した deriv

(define (deriv exp var)
  (cond ((number? exp) 0)
    ((variable? exp)
     (if (same-variable? exp var) 1 0))
    ((sum? exp)
     (make-sum (deriv (addend exp) var)
           (deriv (augend exp) var)))
    ((product? exp)
     (make-sum
      (make-product (multiplier exp)
            (deriv (multiplicand exp) var))
      (make-product (deriv (multiplier exp) var)
            (multiplicand exp))))
    ((exponentiation? exp)
     (make-product (make-product (exponent exp)
                     (make-exponentiation
                      (base exp) 
                      (make-sum (exponent exp) -1)))
            (deriv (base exp) var)))
    (else
     (error "unknown expression type -- DERIV" exp))))