* Exercise 2.53

#+BEGIN_SRC scheme
  (list 'a 'b 'c)		;; (a b c)
  (list (list 'george))	;; ((george))
  (cdr '((x1 x2) (y1 y2))) ;; ((y1 y2))
  (cadr '((x1 x2) (y1 y2))) ;; (y1 y2)
  (pair? (car '(a short list))) ;; f
  (memq 'red '((red shoes) (blue socks))) ;; ()
  (memq 'red '(red shoes blue socks)) ;; (red shoes blue socks)
#+END_SRC

* Exercise 2.54
#+BEGIN_SRC scheme
  (define (myequal? one other)
    (cond ((and (null? one) (null? other))
	   true)
	  ((eq? (car one) (car other))
	   (myequal? (cdr one) (cdr other)))
	  (else false)))

  (myequal? '(guop ice) '(guop ice))
  (myequal? '(a b (1 2) c) '(a b (1 2) c))
#+END_SRC

* Exercise 2.56
#+BEGIN_SRC scheme
  (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
	    (exponent exp)
	    ;; in progress
	    (make-exponent (base exp)
			   (- n 1)
			   (deriv (base exp) var))))
	  (else
	   (error "unknown expression type -- DERIV" exp))))

  ;;;;;;;; to define below this magnificantly high abstration level ;;;;;;;;;

  (define (variable? x) (symbol? x))
  (define (same-variable? v1 v2)
    (and (variable? v1) (variable? v2) (eq? v1 v2)))
  (define (make-sum a1 a2)
    (cond ((=number? a1 0) a2)
	  ((=number? a2 0) a1)
	  ((and (number? a1) (number? a2)) (+ a1 a2))
	  (else
	   (list '+ a1 a2))))
  (define (=number? exp num)
    (and (number? exp) (= exp num)))
  (define (make-product m1 m2)
    (cond ((or (=number? m1 0) (=number? m2 0)) 0)
	  ((=number? m1 1) m2)
	  ((=number? m2 1) m1)
	  ((and (number? m1) (number? m2)) (* m1 m2))
	  (else (list '* m1 m2))))
  (define (sum? x)
    (and (pair? x) (eq? (car x) '+)))
  (define (addend s) (cadr s))
  (define (augend s) (caddr s))
  (define (product? x)
    (and (pair? x) (eq? (car x) '*)))
  (define (multiplier p) (cadr p))
  (define (multiplicand p) (caddr p))

  (deriv '(* (* x y) (+ x 3)) 'x)

  ;;;;;;; to implement below the exercise ;;;;;;;
#+END_SRC

#+BEGIN_SRC scheme
  (define (exponentiation? x)
    (and (pair? x) (eq? (car x) '**)))
  (define (base x) (cadr x))
  (define (exponent x) (caddr x))
  (define (make-exponentiation a1 a2)
    (cond ((=number? a2 0) 1)
	  ((=number? a2 1) a1)
	  ((and (number? a1) (number? a2)) (* a1 (make-exponentiation a1 (- a2 1))))
	  (else (list '** a1 a2))))

  (make-exponentiation 2 6)
#+END_SRC
