#! R6rs
(Import (rnrs base (6 ))
(Rnrs Io simple (6 )))
(Define (deriv exp var)
(Define (variable? X)
(Symbol? X ))
(Define (= number? Exp num)
(And (number? Exp)
(= Exp num )))
(Define (same-variable? X1 x2)
(And (variable? X1)
(Variable? X2)
(EQ? X1 x2 )))
(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 (make-Product M 1 m2)
(Cond (or (= number? M1 0)
(= Number? M2 0 ))
0)
(= Number? M1 1)
M2)
(= Number? M2 1)
M1)
(And (number? M1)
(Number? M2 ))
(* M 1 m2 ))
(Else
(List '* M 1 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 ))
(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 ))))
(Else
(Error "unknown expression type: deriv" exp ))))
The Differentiation Program with abstract data