Skip to content

Instantly share code, notes, and snippets.

@vito
Created December 11, 2010 19:25
Show Gist options
  • Save vito/737591 to your computer and use it in GitHub Desktop.
Save vito/737591 to your computer and use it in GitHub Desktop.
deriving in common lisp
(ql:quickload "fare-matcher")
(defpackage :derive
(:use :common-lisp
:fare-matcher))
(in-package :derive)
(defvar *variable*)
(defun independentp (n)
(or (eq n 'e) (numberp n)))
(defun dependentp (n)
(eq n *variable*))
(defun derive-expr (expr)
(match expr
; with respect to some variable
(`(lambda (,x) ,e) (let ((*variable* x)) (derive-expr e)))
; exponentiation
(`(,x ^ ,y)
(cond
((independentp y) `(,y * (,x ^ (,y - 1)) * ,(derive-expr x)))
((independentp x) `((,x ^ ,y) * ,(derive-expr y)))
(t (derive-expr `(e ^ (,y * (ln ,x)))))))
; simple transformations
(`(sqrt ,x) (derive-expr `(,x ^ 1/2)))
(`(ln ,x) `(1 / ,x))
(`(log ,x ,a) `(1 / (,x * (ln ,a))))
; division
(`(,x / ,y) `(((,(derive-expr x) * ,y) - (,x * ,(derive-expr y))) / (,y ^ 2)))
; multiplication
(`(,x * ,y) `((,x * ,(derive-expr y)) + (,(derive-expr x) * ,y)))
; addition
(`(,a + ,b) `(,(derive-expr a) + ,(derive-expr b)))
; subtraction
(`(,a + ,b) `(,(derive-expr a) - ,(derive-expr b)))
; trigonometry
(`(sin ,x) `((cos ,x) * ,(derive-expr x)))
(`(cos ,x) `(-1 * (sin ,x) * ,(derive-expr x)))
(`(tan ,x) `((sec ,x) ^ 2))
(x (cond
((independentp x) 0)
((dependentp x) 1)
(t x)))))
(defmacro derive (v e)
`',(derive-expr `(lambda (,v) ,e)))
(format t "~A~%" (derive x (x ^ 2)))
(format t "~A~%" (derive x (3 * (x ^ 3/2))))
(format t "~A~%" (derive x (x ^ x)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment