Plaster

common-lisp
CL-USER> (defun diff (j) (cond ((numberp j) 0) ((eql j 'x) 1) ((eql (car j) '+) (cons '+ (mapcar #'diff (cdr j)))) ((eql (car j) '*) (cons '+ (mapcar (lambda (k) (cons '* (mapcar (lambda (l) (if (eql l k) (diff l) l)) (cdr j)))) (cdr j)))))) WARNING: redefining COMMON-LISP-USER::DIFF in DEFUN DIFF CL-USER> (diff '(+ 2 (* 2 x))) (+ 0 (+ (* 0 X) (* 2 1)))