|
| 1 | +#lang sicp |
| 2 | + |
| 3 | +(define (deriv exp var) |
| 4 | + (cond ((number? exp) 0) |
| 5 | + ((variable? exp) |
| 6 | + (if (same-variable? exp var) 1 0)) |
| 7 | + ((sum? exp) |
| 8 | + (make-sum (deriv (addend exp) var) |
| 9 | + (deriv (augend exp) var))) |
| 10 | + ((product? exp) |
| 11 | + (make-sum |
| 12 | + (make-product (multiplier exp) |
| 13 | + (deriv (multiplicand exp) var)) |
| 14 | + (make-product (deriv (multiplier exp) var) |
| 15 | + (multiplicand exp)))) |
| 16 | + (else |
| 17 | + (error "unknown expression type -- DERIV" exp)))) |
| 18 | + |
| 19 | +(define (variable? x) (symbol? x)) |
| 20 | + |
| 21 | +(define (same-variable? v1 v2) |
| 22 | + (and (variable? v1) (variable? v2) (eq? v1 v2))) |
| 23 | + |
| 24 | +(define (make-sum a1 a2) |
| 25 | + (cond ((=number? a1 0) a2) |
| 26 | + ((=number? a2 0) a1) |
| 27 | + ((and (number? a1) (number? a2)) (+ a1 a2)) |
| 28 | + (else (list a1 '+ a2)))) |
| 29 | + |
| 30 | +(define (=number? exp num) |
| 31 | + (and (number? exp) (= exp num))) |
| 32 | + |
| 33 | +(define (make-product m1 m2) |
| 34 | + (cond ((or (=number? m1 0) |
| 35 | + (=number? m2 0)) |
| 36 | + 0) |
| 37 | + ((=number? m1 1) m2) |
| 38 | + ((=number? m2 1) m1) |
| 39 | + ((and (number? m1) (number? m2)) |
| 40 | + (* m1 m2)) |
| 41 | + (else (list m1 '* m2)))) |
| 42 | + |
| 43 | +(define (sum? x) |
| 44 | + (and (pair? x) (eq? (cadr x) '+))) |
| 45 | + |
| 46 | +(define (addend s) (car s)) |
| 47 | + |
| 48 | +(define (augend s) (caddr s)) |
| 49 | + |
| 50 | +(define (product? x) |
| 51 | + (and (pair? x) (eq? (cadr x) '*))) |
| 52 | + |
| 53 | +(define (multiplier p) (car p)) |
| 54 | + |
| 55 | +(define (multiplicand p) (caddr p)) |
| 56 | + |
| 57 | +;; (display (deriv '(+ x 3) 'x)) |
| 58 | +;; (newline) |
| 59 | +;; (display (deriv '(* x y) 'x)) |
| 60 | +;; (newline) |
| 61 | +;; (display (deriv '(* (* x y) (+ x 3)) 'x)) |
| 62 | +;; (newline) |
| 63 | +(display (deriv '(x + (3 * (x + (y + 2)))) 'x)) |
| 64 | + |
0 commit comments