exercises.org 2.6 KB

Exercise 2.53

  (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)

Exercise 2.54

  (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))

Exercise 2.56

  (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 ;;;;;;;
  (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)