1 (define (deriv exp var)
2 (cond ((number? exp) 0)
3 ((variable? exp) (if (same-variable? exp var) 1 0))
5 (make-sum (deriv (addend exp) var)
6 (deriv (augend exp) var)))
9 (make-product (multiplier exp)
10 (deriv (multiplicand exp) var))
11 (make-product (deriv (multiplier exp) var)
13 (else (error "unknown expression type -- DERIV" exp))))
15 (define (deriv exp var)
16 (cond ((number? exp) 0)
17 ((variable? exp) (if (same-variable? exp var) 1 0))
18 (else ((get 'deriv (operator exp)) (operands exp) var))))
19 (define (operator exp) (car exp))
20 (define (operands exp) (cdr exp))
24 (require rnrs/mutable-pairs-6)
26 (define (assoc key records)
27 (cond ((null? records) #f)
28 ((equal? key (caar records)) (car records))
29 (else (assoc key (cdr records)))))
31 (let ((local-table (list '*table*)))
32 (define (lookup key-1 key-2)
33 (let ((subtable (assoc key-1 (cdr local-table))))
35 (let ((record (assoc key-2 (cdr subtable))))
40 (define (insert! key-1 key-2 value)
41 (let ((subtable (assoc key-1 (cdr local-table))))
43 (let ((record (assoc key-2 (cdr subtable))))
45 (set-cdr! record value)
47 (cons (cons key-2 value)
55 (cond ((eq? m 'lookup-proc) lookup)
56 ((eq? m 'insert-proc!) insert!)
57 (else (error "Unknown operation -- TABLE" m))))
59 (define operation-table (make-table))
60 (define get (operation-table 'lookup-proc))
61 (define put (operation-table 'insert-proc!))
63 (define (deriv exp var)
64 ((get 'deriv (operator exp)) (operands exp) var))
65 (define (operator exp)
66 (cond ((number? exp) 'number)
67 ((variable? exp) 'variable)
69 (define (operands exp)
73 (define (install-number-routines)
74 (define (derivative ops var) 0)
75 (put 'deriv 'number derivative))
76 (define (install-variable-routines)
77 (define (derivative ops var)
78 (if (same-variable? (car ops) var) 1 0))
79 (put 'deriv 'variable derivative))
80 (install-number-routines)
81 (install-variable-routines)
83 (define (install-sum-routines)
84 (define (derivative ops var)
87 (deriv (cadr ops) var)))
88 (put 'deriv '+ derivative))
89 (define (install-product-routines)
90 (define (derivative ops var)
92 (make-product (car ops)
93 (deriv (cadr ops) var))
94 (make-product (deriv (car ops) var)
96 (put 'deriv '* derivative))
97 (install-sum-routines)
98 (install-product-routines)
100 ((exponentiation? exp)
102 (make-product (exponent exp)
103 (make-exponentiation (base exp)
104 (make-sum (exponent exp) -1)))
105 (deriv (base exp) var)))
107 (define (install-exponent-routines)
108 (define (derivative ops var)
110 (make-product (cadr ops)
111 (make-exponentiation (car ops)
112 (make-sum (cadr ops) -1)))
113 (deriv (car ops) var)))
114 (put 'deriv '** derivative))
116 ((get (operator exp) 'deriv) (operands exp) var)
118 (define (install-derivative-routines)
119 (define (sum ops var)
121 (deriv (car ops) var)
122 (deriv (cadr ops) var)))
123 (define (product ops var)
125 (make-product (car ops)
126 (deriv (cadr ops) var))
127 (make-product (deriv (car ops) var)
129 (define (exponent ops var)
131 (make-product (cadr ops)
132 (make-exponentiation (car ops)
133 (make-sum (cadr ops) -1)))
134 (deriv (car ops) var)))
136 (put '* 'deriv product)
137 (put '** 'deriv exponent))