diff --git a/cl/lizfcm.asd b/cl/lizfcm.asd new file mode 100644 index 0000000..9e91eb0 --- /dev/null +++ b/cl/lizfcm.asd @@ -0,0 +1,29 @@ +(asdf:defsystem "lizfcm" + :version "0.1.0" + :author "Elizabeth Hunt" + :license "MIT" + :components ((:module "src" + :components + ((:module "utils" + :components + ((:file "within-range" :depends-on ("package")) + (:file "package"))) + (:module "approx" + :components + ((:file "derivative" :depends-on ("package")) + (:file "package"))))))) + + +(asdf:defsystem "lizfcm/tests" + :author "Elizabeth Hunt" + :license "MIT" + :depends-on (:fiveam + :lizfcm) + :components ((:module "tests" + :components + ((:file "approx" :depends-on ("suite")) + (:file "suite")))) + :perform (asdf:test-op (o c) (uiop:symbol-call + :fiveam :run! + (uiop:find-symbol* :lizfcm-test-suite :lizfcm/tests)))) + diff --git a/cl/src/approx/derivative.lisp b/cl/src/approx/derivative.lisp new file mode 100644 index 0000000..280463f --- /dev/null +++ b/cl/src/approx/derivative.lisp @@ -0,0 +1,8 @@ +(in-package :lizfcm.approx) + +(defun derivative-at (f x &optional (delta 0.01)) + (let* ((x2 (+ x delta)) + (x1 (- x delta)) + (y2 (apply f (list x2))) + (y1 (apply f (list x1)))) + (/ (- y2 y1) (- x2 x1)))) diff --git a/cl/src/approx/package.lisp b/cl/src/approx/package.lisp new file mode 100644 index 0000000..60dd0bb --- /dev/null +++ b/cl/src/approx/package.lisp @@ -0,0 +1,4 @@ +(in-package :cl-user) +(defpackage lizfcm.approx + (:use :cl) + (:export :derivative-at)) diff --git a/cl/src/utils/package.lisp b/cl/src/utils/package.lisp new file mode 100644 index 0000000..0436a94 --- /dev/null +++ b/cl/src/utils/package.lisp @@ -0,0 +1,4 @@ +(in-package :cl-user) +(defpackage lizfcm.utils + (:use :cl) + (:export :within-range-p)) diff --git a/cl/src/utils/within-range.lisp b/cl/src/utils/within-range.lisp new file mode 100644 index 0000000..9a0b762 --- /dev/null +++ b/cl/src/utils/within-range.lisp @@ -0,0 +1,5 @@ +(in-package :lizfcm.utils) + +(defun within-range-p (x true-value delta) + (and (< x (+ true-value delta)) + (> x (- true-value delta)))) diff --git a/cl/tests/approx.lisp b/cl/tests/approx.lisp new file mode 100644 index 0000000..a458e66 --- /dev/null +++ b/cl/tests/approx.lisp @@ -0,0 +1,23 @@ +(defpackage lizfcm/tests.approx + (:use :cl + :fiveam + :lizfcm.approx + :lizfcm.utils + :lizfcm/tests) + (:export :approx-suite)) +(in-package :lizfcm/tests.approx) + +(def-suite approx-suite + :in lizfcm-test-suite) +(in-suite approx-suite) + +(test derivative-at + :description "derivative at is within bounds" + (let ((f (lambda (x) (* x x))) + (x 2) + (f-prime-at-x 4) + (delta 0.01)) + (is (within-range-p + (derivative-at f x delta) + f-prime-at-x + 0.1)))) diff --git a/cl/tests/suite.lisp b/cl/tests/suite.lisp new file mode 100644 index 0000000..e23cfaf --- /dev/null +++ b/cl/tests/suite.lisp @@ -0,0 +1,10 @@ +(in-package :cl-user) +(defpackage lizfcm/tests + (:use :cl + :fiveam) + (:export :run! + :lizfcm-test-suite)) +(in-package :lizfcm/tests) + +(def-suite lizfcm-test-suite + :description "The ultimate parent test suite")