Chez syntax case and phasing was driving me insane. Rewriting symbolic derivatives using functions only.
(define (derive variable expr)
(format #t "~a ~a ~%" variable expr)
(if (list? expr)
(let ((op (car expr)))
(case (car expr)
('+ (derive-sum variable expr))
('* (derive-prod variable expr))
('expt (derive-expt variable expr))
(else (derive-atomic variable expr ))))
(derive-atomic variable expr)))
(define (derive-atomic variable expr)
(if (list? expr)
expr
(if (eqv? variable expr)
1
0)))
(define (derive-sum variable expr)
(let ((args (cdr expr)))
(cons '+ (map (lambda (e) (derive variable e)) args))))
(define (derive-prod variable expr)
(let* ((args (cdr expr))
(f (cadr expr))
(g (caddr expr)))
`(+ (* ,f ,(derive variable g))
(* ,g ,(derive variable f)))))
(define (derive-expt variable expr)
(let* ((args (cdr expr))
(base (car args))
(expoent (cdr args)))
(cond
[(eqv? variable base) `(* ,expoent (expt ,base (- ,expoent 1)) ,(derive variable base))]
[(or (number? base) (atom? base)) `(* (expt ,base ,expoent) (log ,base) ,(derive variable expoent))]
[else `(+ (* ,expoent (expt ,base (- ,expoent 1)) ,(derive variable base))
(* (expt ,base ,expoent) (log ,base) ,(derive variable expoent)))])))