Symbolic Data

;; Symbolic differentiation (SICP 2.3.2)
(define (variable? x) (symbol? x))
(define (same-variable? a b) (and (variable? a) (variable? b) (eq? a b)))
(define (=number? e n) (and (number? e) (= e n)))
(define (make-sum a b)
  (cond ((=number? a 0) b) ((=number? b 0) a)
        ((and (number? a) (number? b)) (+ a b))
        (else (list '+ a b))))
(define (make-product a b)
  (cond ((or (=number? a 0) (=number? b 0)) 0)
        ((=number? a 1) b) ((=number? b 1) a)
        ((and (number? a) (number? b)) (* a b))
        (else (list '* a b))))
(define (make-exponentiation base n)
  (cond ((=number? n 0) 1) ((=number? n 1) base) (else (list '** base n))))
(define (sum? e) (and (pair? e) (eq? (car e) '+)))
(define (product? e) (and (pair? e) (eq? (car e) '*)))
(define (exponentiation? e) (and (pair? e) (eq? (car e) '**)))

(define (deriv e var)
  (cond ((number? e) 0)
        ((variable? e) (if (same-variable? e var) 1 0))
        ((sum? e) (make-sum (deriv (cadr e) var) (deriv (caddr e) var)))
        ((product? e)
         (make-sum (make-product (cadr e) (deriv (caddr e) var))
                   (make-product (deriv (cadr e) var) (caddr e))))
        ((exponentiation? e)
         (ma
…