宿題を教えてほしいんですが…

(defun diff (e a)
(cond ((atom e) (cond ((eq e a) 1) (t 0)))
((eq (op e) '+)
(make-sum (diff (arg1 e) a) (diff (arg2 e) a)))
((eq (op e) '*)
(make-sum (make-prod (diff (arg1 e) a) (arg2 e))
(make-prod (arg1 e) (diff (arg2 e) a))))))

(defun op (e) (car e))
(defun arg1 (e) (cadr e))
(defun arg2 (e) (caddr e))
(defun make-sum (x y)
(cond ((eq x 0) y) ((eq y 0) x) (t (list '+ x y))))
(defun make-prod (x y)
(cond ((eq x 0) 0) ((eq y 0) 0)
((eq x 1) y) ((eq y 1) x) (t (list '* x y))))

で、-,/,sin,cos,tan,exp,logなどを含む式も微分できるようにdiffを変更して
(* (exp (- x)) (sin (* 2 (* pi x))))を微分せよって問題です。

なんかうまく答えが出てくれなくて・・